Zend Framework中的UnitTest错误控制器

时间:2010-12-04 06:31:58

标签: zend-framework phpunit

我是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');

}

2 个答案:

答案 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插件操作此行为(扩展原始版本,并假装抛出异常)。也许只有一次测试就可以注册它。