![](/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.