![](/img/trans.png)
[英]Laravel unit tests: redefinition error when running multiple test methods
[英]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.