【问题标题】:PHPUnit - how to mock/stub a redirect method?PHPUnit - 如何模拟/存根重定向方法?
【发布时间】: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


【解决方案1】:

好的,我找到了问题所在:因为应用程序是 MVC 架构,所以在调度期间调用的 exit; 是一个不好的方法。

取而代之的是,在正确设置响应标头之后(为了重定向),我一直返回 false 直到它返回到调度过程。在这种情况下,我不需要再打电话给exit;

此案例的单元测试运行顺利,无需任何更改(它是在测试类中的exit; 调用之前实现的)。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2018-02-08
    • 2019-08-07
    • 2013-01-27
    • 2013-02-02
    • 2011-03-05
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多