2017-09-05 129 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

相关问题