簡體   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