【发布时间】:2014-01-22 10:36:41
【问题描述】:
我正在做一个 PHP 单元测试,我需要测试(虽然需要 100% 的代码覆盖率)一个实现它自己的 redirect($url, $code) 方法的类。该方法在最后调用exit;,以确保重定向后没有其他代码被执行(如果没有这个exit;,重定向最终不会完成......)。
现在这个重定向方法在 7 种不同的条件下被调用,它们都有自己的单元测试用例。如果我在测试类中存在exit; 时运行单元测试,则单元测试也会退出。每个测试用例都在测试以下内容:
$this->assertRedirect();
$this->assertResponseStatusCode(401);
因此我需要存根redirect 方法,以便它设置Location 标头以及状态代码。
这是我想要做的(使用重定向方法的内容,除了 exit; 部分 - 但它显然不起作用):
$this->class = $this->getMockBuilder('Some\Name\Space\Class')
->disableOriginalConstructor()
->getMock();
$this->class->expects($this->any())
->method('redirect')
->will($this->returnCallback(function () {
$this->response->getHeaders()->addHeaderLine('Location: /');
$this->response->setStatusCode(401);
$this->response->sendHeaders();
}));
以及我之前尝试过的(但效果不佳):
$this->class = $this->getMockBuilder('Some\Name\Space\Class')
->disableOriginalConstructor()
->getMock();
$this->class->expects($this->any())
->method('redirect')
->will($this->returnCallback(function () {
header('Location: /');
}));
现在该类的目的是在 90% 的代码覆盖率中重定向某处(仅在一种情况下 - 90 行中有 2 行 - 它没有重定向)所以不可能存根这个重定向(并且不可能测试完全重定向)测试用例对这个类几乎没有任何意义(这是不愿意的)。
非常感谢任何帮助。
编辑: 看起来 phpunit/test_helpers 可以解决问题,但不幸的是,我无法将此扩展安装到我们的预览和生产环境中,在这些环境中,每个应用程序部署都会自动运行测试。
【问题讨论】:
-
从未测试过,但我搜索了 assertRedirectTo 并找到了这个。 stackoverflow.com/questions/4240952/…
-
@RoyalBg 在这种情况下,建议省略失败的重定向测试或一般来说 ZF1 的答案应该如何帮助我?
-
有一条关于 mocks 和 stubs 的评论,其中给出了链接,但我无法打开它,所以我的研究工作被阻止了。 avnetlabs.com/zend-framework/… 我认为这可能会有所帮助。如果不是,请向我道歉。
-
我也打不开,谢谢你的链接...
标签: php zend-framework2 phpunit