【问题标题】:PHPUnit Zend Framework Controller Tests - Failed asserting last controller used <"error"> - display errorsPHPUnit Zend 框架控制器测试 - 断言使用的最后一个控制器失败 <"error"> - 显示错误
【发布时间】:2011-08-27 05:01:14
【问题描述】:

我们目前正在围绕 zend 框架控制器进行单元测试。

(我对这个代码示例做了一点抽象,但是思路是一样的......)

我们很高兴地设法使测试失败,并显示错误消息

Failed asserting last controller used &lt;"error"&gt; ....

通过测试:

$this->dispatch('/controller/action/param');
$this->assertController('controller');
$this->assertAction('action');

所以在这种情况下,我如何让真正的错误消息冒泡到 PHPUnit,即如果控制器中有错误,我想知道它而不是调用错误控制器。

如果我在 application.ini 中设置resources.frontController.params.noErrorHandler = 1,即使出现错误,测试也会通过,因为该控制器和操作仍然发生,但什么也不输出(我知道我可以在输出中查找断言,但是这不是重点——我想要原来的错误)。

我试过打开

convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true" 

在 phpunit.xml 中也是如此,没有乐趣。

任何指针将不胜感激。

我希望所有这些都有意义!?

非常感谢。

【问题讨论】:

    标签: zend-framework phpunit


    【解决方案1】:

    不幸的是 Zend_Test_PHPUnit_ControllerTestCase 在调度期间明确地覆盖了一些前端控制器选项。相关的代码在这里:

    $controller = $this->getFrontController();
    $this->frontController
         ->setRequest($request)
         ->setResponse($this->getResponse())
         ->throwExceptions(false)
         ->returnResponse(false);
    

    因为这是在 dispatch() 内部完成的,所以您绝对没有机会更改选项。

    我使用的一个解决方案是创建我自己的基础 ControllerTestCase 来扩展 Zend 并从 Zend 对象复制整个 dispatch() 函数,然后更改那一行。

    它很乱,但它有效。你可以做一个更精细的版本,从配置等中读取一些东西。

    【讨论】:

    • 愚蠢的问题:哪一行代码需要修改,改成什么?
    • @blainarmstrong 将true 传递给throwExceptions
    【解决方案2】:

    我也遇到过这个问题,有时很难找到错误。我偶然发现了一个解决方案——我修改了错误控制器以在我们的生产环境中发生错误时发送电子邮件,但我不小心将它设置为在测试环境中发送——然后当其中一个错误发生在单元测试中,我收到了一封详细说明错误的电子邮件。

    您不必使用电子邮件通知,但您可能需要查看http://framework.zend.com/manual/en/zend.log.writers.html 的错误记录。您可以将错误写入日志文件,然后检查日志文件。

    【讨论】:

    • 谢谢 - 这肯定会告诉我问题(导致它的原因),并且比在尝试跟踪它时将调试行放入代码中更简洁一些。我很高兴我不是唯一一个遇到这个问题的人。
    猜你喜欢
    • 2011-04-05
    • 2015-03-03
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2021-04-04
    相关资源
    最近更新 更多