PHPUnit Zend框架控制器测试 - 使用最后一个控制器失败<“error”> - 显示错误

时间:2011-05-17 12:27:23

标签: zend-framework phpunit

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

(我已经抽象了一下这个代码示例,但想法是一样的....)

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

Failed asserting last controller used <"error"> ....

测试:

$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中,没有快乐。

任何指针都会非常感激。

我希望所有这些都有道理!?

非常感谢。

2 个答案:

答案 0 :(得分:5)

不幸的是,Zend_Test_PHPUnit_ControllerTestCase在调度期间显式覆盖了一些前控制器选项。相关的代码位在这里:

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

因为这是在dispatch()中完成的,所以你绝对没有机会改变选项。

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

它很乱,但它有效。你可以做一个更复杂的版本,从配置等中读取内容。

答案 1 :(得分:1)

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

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