2017-09-05 104 views
1

我正在接近phpunit單元測試的100%代碼覆蓋範圍,但目前我唯一沒有涉及的是路由。我不確定如何測試它。任何人都可以協助嗎?單元測試在silex中的匿名回調路由

我使用Silex的框架做我的路由按以下方式:

$api->put('/update/{websiteName}/{endpointName}', function($websiteName, $endpointName, Request $request) use ($databaseServiceContainer, $sourceRetrievalService) { 
    $controller = new RequestController(
     $databaseServiceContainer, 
     $sourceRetrievalService 
    ); 

    return $controller->update(
     $websiteName, 
     $endpointName, 
     $request 
    ); 
}); 

創建自己覆蓋的路由,而不是內部的匿名回調。

正如你可以在此圖像中看到:在https://github.com/ri0t1985/api-creator

+0

https://stackoverflow.com/questions/17580005/silex-phpunit-functional-tests有幫助嗎? –

+0

不,對不起。這將是一個功能測試,而不是單元測試:) – Erik

+0

由於您在路由定義中創建了服務,因此測試它會有點困難,不是嗎? – localheinz

回答

1

我很確定這不需要進行單元測試。您可以通過功能/驗收測試覆蓋路由器。

但是,如果你真的想通過單元測試覆蓋路由器的配置,你可以使用這種方法:

// ... 

$path = '/foo'; 

$app = new Application(); 
$app->get($path, function() { 
    return 'foo'; 
}); 

$request = Request::create($path, 'GET'); 
$response = $app->handle($request); 

$this->assertEquals('foo', $response->getContent()); 
// ... 

尋找your implementation on github,該dependensies從DI到達這裏。這很難支持,所以想想如何讓這個類更具可測性。

希望這會有所幫助!

0

As you can see within this image.

完整的代碼可說實話,有這些路由定義沒有「活動部件」,所以他們不真的不需要UNIT測試覆蓋率。只需在該課程上放置@codeCoverageIgnore,即可消除報告中的粉紅色部分。如果它們都集中到應用程序類中,請首先將它們拉出到路徑定義類中。

對於這樣的事情,通過功能測試自動化測試。您可以使用WebTestCases(https://silex.symfony.com/doc/2.0/testing.html#webtestcase)來測試實際的請求行爲。

更新: 可能使這個更清楚......考慮如果你使用YAML配置你的路線,而不是編碼它們(這可能是一個好主意),你不會試圖單元測試YAML會您?不,Cos將會是愚蠢的。您可以通過WebTestCase在功能上測試請求本身。 yer路由配置在代碼中完成時也是如此。

+1

我很清楚,我可以簡單地忽略它們的代碼覆蓋率,但這永遠不會被認爲是最佳實踐。如果控制器的簽名會改變,創建路由將失敗。我想在單元測試中檢測這個 – Erik

+1

雖然這不是*單元測試*的工作,所以它完全*是「最佳實踐」,不能用不恰當的工具測試某些工作。單元測試不應該考慮外部因素,比如「如果控制器的簽名會改變」,他們應該關注被測試的精確函數。該功能中沒有移動部件,因此不需要單元測試。然而,它可以通過功能測試中的推斷進行測試。使用WebTestCase功能測試控制器還將確保路由定義的完整性。 –

+0

通常我會同意,但我使用數據庫中的內容來動態生成新路線。檢查這些路由是否成功創建完全是單元測試的工作。到目前爲止,我還沒有找到一種方法來測試路線是否真的存在。 – Erik