使用laravel运行单元测试时,如何测试App :: error()实现?

时间:2013-12-20 22:03:19

标签: php unit-testing exception laravel phpunit

我目前正在开发一个开源个人项目,为游戏开发者提供了一个很好的后端api。我正处于开发的早期阶段,但我计划在进行测试时编写测试,这就是我遇到的障碍。

当出现错误,例如错误的api凭据或缺少凭据时,我会抛出一个自定义异常,它会存储一些额外的数据,以便我可以捕获它并提供JSON编码的响应。

对于那些在我的BaseController中抛出的测试,测试工作正常,但我也捕获了一些Laravel Exceptions,所以我可以用我自己的,或者至少输出JSON来回复,如下所示:

应用程序/开始/ global.php

App::error(function(Exception $exception, $code) {
    Log::error($exception);
});

App::missing(function(Exception $exception) {
    return BaseController::error(
            Config::get('response.method.code'), 
            Config::get('response.method.http'), 
            'Method not found'
    );
});

App::error(function(Viper\Exception $exception) {
    return BaseController::error(
            $exception->getCode(), 
            $exception->getStatusCode(), 
            $exception->getMessage()
    );
});

我正在使用try { } catch() { }方法,因为我需要检查一个不在正常例外中的额外值。

public function testNoMethodGET() {
    $config = Config::get('response.method');

    try {
        $this->call('GET', '/');
    } catch(\Viper\Exception $e) {
        $this->assertEquals($e->getCode(), $config['code']);
        $this->assertEquals($e->getStatusCode(), $config['http']);
    }

    $this->fail('Exception not thrown');
}

这一切都很好,但是我想检查实际响应的一些内容,例如,json是否有效,响应结构是否匹配以及响应值是否匹配正确的。

如果我将$this->call()的返回值设置为变量,我将无法访问catch块中的那个变量,所以问题是这样,如何测试返回值一旦异常被捕获,$this->call()

1 个答案:

答案 0 :(得分:1)

Taylor Otwell表示:

  
    

"这可以通过解耦来解决     测试。你真的想测试处理程序和异常     完全单独抛出 无论如何[原文如此]来隔离你的测试。对于     实例:

  
App::error(function(ErrorType $e)
{
     App::make('ErrorTypeHandler')->handle($e);
});
  
    

现在,您可以分别为ErrorTypeHandler类编写测试用例     从您的其他应用程序。然后检查正确的例外情况     由你的应用程序抛出@expectedException。"

  

在您的情况下,您已经在BaseController :: error()中隔离了错误处理程序,因此您可以直接在单独的单元测试中测试响应,而无需使用$ this-> call()。相反,只需使用所需的参数调用$ response = BaseController :: error(),然后检查响应并应用相关的断言。