我正在使用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 ...
参考:
答案 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
或其他一些。