2013-12-20 28 views
1

我目前工作的一個開源的個人項目,提供一個很好的後端API的遊戲開發商。我正處於開發的早期階段,但我計劃隨着時間編寫測試,這正是我遇到困難的地方。當運行單元測試與laravel,你怎麼測試你的應用程序::錯誤()實現?

通過了系統的時候是不正確的API憑證或丟失憑證發生這樣的錯誤,我把它存儲一些額外的數據,以便我能趕上它,並給一個JSON編碼的響應自定義異常。

測試工作的優良那些在我BaseController拋出,但我也拍攝了幾Laravel例外,所以我可以用我自己的迴應,或者至少,輸出JSON象下面這樣:

應用程序/啓動/全球。 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

根據泰勒Otwell:

「這可以通過去耦您 測試解決你真的要測試的處理程序和該異常 拋出完全分開反正。 [原文]隔離你的測試對於 例如:

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

現在你可以從你的應用程序的其餘編寫測試用例ErrorTypeHandler類分別 。然後檢查 通過與@ExpectedException您的應用程序拋出,適當的異常。」

在你的情況,你已經隔離您的錯誤處理程序BaseController ::錯誤(),這樣就可以直接測試在單獨的單元測試的響應,而無需使用$這 - >()調用。相反,只需要調用$響應= BaseController ::誤差()與期望的參數,然後檢查響應並應用相關斷言。

+0

啊優良,謝謝:) – ollieread

相關問題