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

sai*_*y2k 3 php rest phpunit slim

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

最初我在匿名函数中拥有所有逻辑

$app->get('/video/', function () use ($app) {
    // all code goes here
}
Run Code Online (Sandbox Code Playgroud)

并通过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));
}
Run Code Online (Sandbox Code Playgroud)

但现在,我将`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;
}
Run Code Online (Sandbox Code Playgroud)

我仍然得到适当的响应呼叫/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

更新:该错误得到了固定,一旦我换成夫妇requirerequire_once.但现在测试中的断言未能说明

1) videoTest::testVideoCountInPage1
Failed asserting that 404 matches expected 200.
Run Code Online (Sandbox Code Playgroud)

当我调用相同的终点时http://localhost/traffic/index.php/video,我将获得具有正确结果的状态200.当PHPUnit调用相同的端点时,它返回404

更新2:单元测试,我测试各个功能,openDB()findPageParameter()正常工作.只有SLIM REST API的端到端测试失败了404 ...

参考:

Ian*_*hek 5

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

这是功能/验收测试领域,有一个名为Behat的神话般的框架.你应该做自己的研究,但实质上,虽然PHPUnit非常擅长测试或多或少独立的功能块,但它很难测试更全面的请求执行等更大的事情.稍后您将开始遇到会话错误,配置错误的环境等问题,因为每个请求都应该在它自己的独立空间中执行,并强制它执行相反的操作.另一方面,Behat以一种非常不同的方式工作,对于每个场景(发布机器人,查看不存在的页面),它向服务器发送新的请求并检查结果.它主要用于通过对最终结果进行断言(响应对象/ html/json)来最终测试所有协同工作.

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