【问题标题】:Slim - Calling endpoint from Browser works fine, while Calling endpoint from PHPUnit Test returns 404Slim - 从浏览器调用端点工作正常,而从 PHPUnit 测试调用端点返回 404
【发布时间】:2014-07-22 05:50:23
【问题描述】:

我正在使用 PHPUnit @ http://there4development.com/blog/2013/10/13/unit-testing-slim-framework-applications-with-phpunit/ 关注 Slim 的测试设置

一开始我的所有逻辑都在匿名函数中

$app->get('/video/', function () use ($app) {
    // all code goes here
}

通过 PHPUnit 进行的测试效果很好...

public function testVideoCountInPage1() {
    $this->get('/video/');
    $this->assertEquals(200, $this->response->status());

    $rawResponse                =   $this->response->body();
    $jsonResponse               =   json_decode($rawResponse);

    $this->assertSame(20, count($jsonResponse->data));
}

但现在,我将 `get('/video/') 中的核心逻辑拆分为多个函数,如下所示:

$app->get('/video/', function () use ($app) {
    // some logic

    $db                             =   openDB($dbConfig);
    $page                           =   findPageParameter($app->request()->params());

    // some logic
}

function openDB($dbConfig) {
    // open DB here
    return                              $db;
}

function findPageParameter($params) {
    // find page here
    return                              (int)$page;
}

调用/video 端点时我仍然得到正确的响应。但是单元测试失败了,说

.PHP Fatal error: Cannot redeclare openDB() (previously declared in /var/www/traffic/app/routes/video.php:69) in /var/www/traffic/app/routes/video.php on line 75

更新: 一旦我用require_once 替换了几个require,这个错误就得到了修复。但是现在测试中的断言失败了

1) videoTest::testVideoCountInPage1
Failed asserting that 404 matches expected 200.

当我调用相同的端点http://localhost/traffic/index.php/video 时,我会得到正确结果的状态 200。当 PHPUnit 调用同一个端点时,它返回 404

更新 2: 单元测试,我在其中测试各个函数 openDB()findPageParameter() 工作正常。只有 SLIM REST API 的端端测试失败并出现 404...

参考:

【问题讨论】:

  • 您尝试多次声明函数,例如。由于多包含文件。如果是这样,请使用require/include_once 而不是require/include
  • 你确定你的代码是这样的吗?错误消息似乎表明 openDB() 函数是在同一文件 (video.php) 的第 69 行 75 处定义的
  • @panther 谢谢它的工作:-) @Phil 是的,我在底部链接了video.php 但是现在断言失败了..

标签: php rest phpunit slim


【解决方案1】:

有一个(有点)类似问题的similar answer。我相信您可以找到解决该问题的方法,但很快您就会看到如何修复会话、重置环境配置等,因为 PHPUnit 是一个单元测试框架,并且根据定义,单元比请求更小.

这是功能/验收测试领域,有一个很棒的框架 称为贝哈特。你应该做你自己的研究,但本质上,虽然 PHPUnit 擅长测试或多或少独立的块 它在测试更大的东西时很糟糕的功能,比如完整的请求 执行。稍后您将开始遇到会话问题 错误、错误配置的环境等,都是因为每个请求都是 应该在它自己的独立空间中执行,你强迫它 做相反的事情。另一方面,Behat 的工作方式非常 不同的方式,每个场景的位置(发布机器人,查看不存在的 page),它向服务器发送一个新的请求并检查结果。 它主要用于最终测试所有一起工作的东西 对最终结果进行断言(响应对象/html/json)。

如果您想以正确的方式测试您的代码,请考虑为此使用正确的工具。一旦您熟悉了 Behat 的使用方式,您就会爱上它 + 您可以在 Behat 中使用 PHPUnit 来进行单独的断言。

【讨论】:

    【解决方案2】:

    当您尝试更改已创建的函数时会出现该错误。

    必须有另一个文件已经在其中创建了函数 OpenDB(),或者在 video.php 文件中。 这就是 Include_once 起作用的原因,因为当你第一次打开 de DB 时,它调用了这个函数。

    从现在开始,检查video.php中包含的所有文件,并找到另一个OpenDB()函数。

    但有件事告诉我,在这些行之前,你的 video.php 中已经有一个 openDB()。

    如果你卡住了,复制所有代码。

    【讨论】:

      【解决方案3】:

      我不确定发生了什么,但我认为您可能遇到了范围问题。当您调用 Slim 应用程序时,这两个函数 (openDB, findPageParameter) 在范围内是全局的,但我认为当您在单元测试中运行它们时,它们是单元测试类的一部分,而不是全局的。结果是测试框架找不到您的两个函数,您需要将它们显式传递到您的应用中或将它们声明为全局函数。

      我实际上已经多次遇到这个问题,并通过将所有当前作用域的对象转储到特定类/函数中来发现它。

      如果您还没有这样做,您应该转储$rawResponse 以查看实际的错误消息是什么。我的猜测是openDB can't be found 或类似的。

      【讨论】:

        猜你喜欢
        • 2017-09-17
        • 2020-12-23
        • 2021-04-20
        • 2020-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-20
        • 2020-03-15
        相关资源
        最近更新 更多