我目前正在开发一个开源个人项目,为游戏开发者提供了一个很好的后端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()
答案 0 :(得分:1)
Taylor Otwell表示:
"这可以通过解耦来解决 测试。你真的想测试处理程序和异常 完全单独抛出 无论如何[原文如此]来隔离你的测试。对于 实例:
App::error(function(ErrorType $e)
{
App::make('ErrorTypeHandler')->handle($e);
});
现在,您可以分别为ErrorTypeHandler类编写测试用例 从您的其他应用程序。然后检查正确的例外情况 由你的应用程序抛出@expectedException。"
在您的情况下,您已经在BaseController :: error()中隔离了错误处理程序,因此您可以直接在单独的单元测试中测试响应,而无需使用$ this-> call()。相反,只需使用所需的参数调用$ response = BaseController :: error(),然后检查响应并应用相关的断言。