【问题标题】:Unit testing anonymous callback routing in silex在silex中单元测试匿名回调路由
【发布时间】:2017-09-08 06:14:21
【问题描述】:

我正在接近 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获取

【问题讨论】:

  • 不,抱歉。那将是功能测试,而不是单元测试:)
  • 由于您在路由定义中创建服务,因此测试它会有点困难,不是吗?
  • 为什么必须是单元测试?归根结底,经过适当测试的应用程序是通过组合测试方法完成的,限制它听起来更像是一种人为的需求,而不是想要正确地测试您的应用程序。
  • 我根据数据库中的记录动态创建路由。通过单元测试,我可以更好地控制用于创建路由的确切数据,并且还可以检查被调用方法的签名。功能测试只会检查路由是否可以正确调用。

标签: php unit-testing phpunit silex


【解决方案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,依赖是从DI这里得到的。这将很难支持,因此考虑如何使这个类更具可测试性是有意义的。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    老实说,这些路由定义中没有“移动部件”,因此它们并不真正需要 UNIT 测试覆盖率。只需将@codeCoverageIgnore 放在课堂上,这将消除报告上的粉红色位。如果它们都只是集中到应用程序类中,请先将它们拉出到路由定义类中。

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

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

    【讨论】:

    • 我很清楚,我可以简单地从代码覆盖率中忽略它们,但这绝不是最佳实践。如果控制器的签名发生变化,创建路由就会失败。我想在单元测试中检测到这一点
    • 不过,这不是 单元测试 的工作,因此不使用不适合该工作的工具进行测试是完全“最佳实践” .单元测试不应该忙于诸如“如果控制器的签名会改变”之类的外部考虑,它们应该专注于被测试的精确功能。该功能中没有移动部件,因此不需要单元测试。然而,它可以通过功能测试中的推理来测试。使用 WebTestCase 对控制器进行功能测试也将确保您的路由定义的完整性。
    • 通常我会同意,但我正在使用数据库中的内容来动态生成新路线。检查这些路由是否成功创建完全是单元测试的工作。到目前为止,我还没有找到一种方法来测试该路线是否真的存在。
    • 这 - github.com/ri0t1985/api-creator/blob/master/src/App/… - 需要单元测试。这就是你的动态数据库驱动的东西所在的地方。它下面的东西可能甚至不属于同一个函数,因为它只是相切相关的。我会将循环提取到doDynamicBindings,并将下面的位提取到doStaticBindings(或其他东西),并测试第一个而不是第二个。您不需要测试 $api->get/post/match 的东西,因为 Silex 在那里工作。然后 功能测试 测试控制器绑定到路由,并正常运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 2020-08-15
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多