繁体   English   中英

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

[英]When running unit tests with laravel, how do you test your App::error() implementations?

我目前正在从事一个开放源代码的个人项目,该项目为游戏开发人员提供了一个不错的后端api。 我处于开发的早期阶段,但是我计划在进行过程中编写测试,这是我遇到的障碍。

当发生错误(例如错误的api凭据或缺少凭据)时,系统会抛出一个自定义异常,该异常存储了一些额外的数据,因此我可以捕获它并给出JSON编码的响应。

这些测试对于在我的BaseController中抛出的测试工作正常,但是我也捕获了一些Laravel异常,因此我可以使用自己的(或至少是)输出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() { }方法,因为我需要检查正常Exception中没有的额外值。

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()的返回值捕获到异常后立即$this->call()

根据泰勒·奥特威尔(Taylor Otwell)的说法:

“这可以通过取消测试的耦合来解决。您确实想测试处理程序,并且无论如何,都会将异常完全单独抛出以隔离测试。例如:

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

现在,您可以与应用程序的其余部分分开编写ErrorTypeHandler类的测试用例。 然后使用@expectedException检查应用是否抛出了适当的异常。”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM