silex 中的单元测试匿名回调路由

Unit testing anonymous callback routing in silex

我正在通过 phpunit 单元测试接近 100% 的代码覆盖率,但我目前唯一没有覆盖的是路由。而且我不确定如何测试它。有人可以帮忙吗?

我正在使用 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

老实说,那些路由定义中没有 "moving parts",所以它们并不真正需要 UNIT 测试覆盖。只需将 @codeCoverageIgnore 放在 class 上,这将消除报告中的粉红色位。如果它们都只是集中到应用程序 class 中,请先将它们拉出到路由定义中 class。

对于这种事情,通过功能测试自动化测试。您可以使用 WebTestCases (https://silex.symfony.com/doc/2.0/testing.html#webtestcase) 来测试实际的请求行为。

更新: 可能是为了更清楚地说明这一点……考虑一下,如果您使用 YAML 配置路由而不是对它们进行编码(无论如何这可能是个好主意),您不会尝试对 YAML 进行单元测试,对吗?不,因为那太愚蠢了。您将通过 WebTestCase 对请求本身进行功能测试。当您在代码中完成路由配置时,这同样适用。

我很确定这不需要进行单元测试。您可以通过 functional/acceptance 测试覆盖路由器。

但是如果你真的想通过单元测试覆盖路由器配置,你可以使用这种方法:

// ...

$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,依赖项是从 DI 获取的。这将很难支持,因此考虑如何使 class 更易于测试是有意义的。

希望对您有所帮助!