Slim - 从浏览器调用端点工作正常,而来自PHPUnit Test的Calling端点返回404

时间:2014-07-22 05:50:23

标签: php rest phpunit slim

我正在使用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替换为require_once,我就修复了该错误。但现在测试中的断言未能说明

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 ...

参考:

3 个答案:

答案 0 :(得分:5)

similar answer到(有点)类似的问题。我确信你可以找到解决这个问题的方法,但很快就会看到如何修复会话,重置环境配置等等,因为PHPUnit是一个单元测试框架,按照定义,单位比请求更小。

  

这是功能/验收测试的领域,并且有一个神话般的框架   叫Behat。你应该做自己的研究,但基本上,同时   PHPUnit非常适合测试或多或少的独立块   功能很糟糕,测试更大的事情,如完整的请求   执行。稍后您将开始遇到会话问题   错误,错误配置的环境等,都是因为每个请求都是   应该在它自己独立的空间中执行并强制它   反其道而行之。另一方面,Behat非常适合工作   不同的方式,每个场景的位置(后机器人,视图不存在   页面),它向服务器发送一个新的请求并检查结果。   它主要用于最终测试一起工作的所有东西   在最终结果上做出断言(响应对象/ html / json)。

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

答案 1 :(得分:0)

当您尝试更改已创建的函数时,会发生错误。

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

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

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

如果您遇到困难,请复制所有代码。

答案 2 :(得分:0)

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

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

如果尚未完成,则应转储$rawResponse以查看实际的错误消息。我的猜测是openDB can't be found或其他一些。