我是100%代码覆盖率的粉丝,但我不知道如何在Zend Framework中测试ErrorController。
测试404Action和errorAction是没有问题的:
public function testDispatchErrorAction()
{
$this->dispatch('/error/error');
$this->assertResponseCode(200);
$this->assertController('error');
$this->assertAction('error');
}
public function testDispatch404()
{
$this->dispatch('/error/errorxxxxx');
$this->assertResponseCode(404);
$this->assertController('error');
$this->assertAction('error');
}
但是如何测试应用程序错误(500)? 也许我需要这样的东西?
public function testDispatch500()
{
throw new Exception('test');
$this->dispatch('/error/error');
$this->assertResponseCode(500);
$this->assertController('error');
$this->assertAction('error');
}
答案 0 :(得分:1)
这是一个古老的问题,但我今天正在努力解决这个问题,并且无法在其他地方找到一个好的答案,所以我会继续发布我为解决这个问题所做的工作。答案其实很简单。
将您的调度指向一个会导致抛出异常的操作。
我的应用程序在向JSON端点发出get请求时抛出错误,因此我使用其中一个来测试它。
/**
* @covers ErrorController::errorAction
*/
public function testErrorAction500() {
/**
* Requesting a page that doesn't exist returns the proper error message
*/
$this->dispatch('/my-json-controller/json-end-point');
$body = $this->getResponse()->getBody();
$this->assertResponseCode('500');
$this->assertContains('Application error',$body);
}
或者,如果您不介意仅为测试而执行操作,则可以创建一个仅引发错误并指向单元测试中的操作的操作。
public function errorAction() {
throw new Exception('You should not be here');
}
然后你的测试看起来像这样:
/**
* @covers ErrorController::errorAction
*/
public function testErrorAction500() {
/**
* Requesting a page that doesn't exist returns the proper error message
*/
$this->dispatch('/my-error-controller/error');
$body = $this->getResponse()->getBody();
$this->assertResponseCode('500');
$this->assertContains('Application error',$body);
}
答案 1 :(得分:0)
好吧,我对这个主题并不是很熟悉,但我会使用自定义的ErrorHandler插件操作此行为(扩展原始版本,并假装抛出异常)。也许只有一次测试就可以注册它。