2013-04-07 49 views
2

我試圖讓我的AuthController可測試。我開始通過注入驗證類,所以我可以在我的測試嘲笑它:我如何模擬Laravel 4中的Auth類?

public function __construct(Auth $auth) 
{ 
    $this->auth = $auth; 
} 

然後我用的是注射類後,當我檢查,如果登錄成功:

public function postLogin() 
{ 
    // instead of Auth::attempt(Input::all()) 
    if ($this->auth->attempt(Input::all()) { 
     return 'you are logged in!'; 
    } else { 
     return 'login failed!'; 
    } 
} 

當我提交我的登錄表單,我得到了Auth::attempt方法沒有定義的錯誤:

FatalErrorException: Error: Call to undefined method Illuminate\Support\Facades\Auth::attempt() ... 

我在做什麼錯?我在模型中看到了這個exact technique,但顯然它不適用於Auth類。

回答

2

好了,你可能會做錯了這裏...

TL;博士

定義模擬驗證適配器和配置驗證在測試中使用。在控制器中使用Auth的靜態方法就好了。

爲什麼這個工程...

的AUTH包implements a Driver (aka Adapter) pattern與驗證類充當依賴管理和單接口的全包。您不應該嘗試將模擬身份驗證實例注入您的控制器,而應該實施模擬身份驗證適配器(如默認的Eloquent和Fluent適配器)。在測試中也嘗試configuring your Auth to use the In-Memory Adapter。從手冊頁(懶惰的)與重點礦:

在內存會話

「記憶」會議驅動程序只使用一個簡單的陣列來存儲您的會話數據的當前請求。 此驅動程序非常適合單元測試您的應用程序,因爲沒有任何內容寫入磁盤。它不應該被用作「真正的」會話驅動程序。

內存適配器只是一個內存數組,因爲您的測試與被測系統(SUT)共享線程,所以您可以從測試代碼中自由檢查會話內容以驗證邊 - 認證和後期條件的影響。

+0

謝謝!我認爲這是比這低的水平。我試着在UserProviderInterface的測試中嘗試創建一個App:instance(...),現在我再次觀看了這個視頻,但這樣做更有意義。 – 2013-04-07 04:14:57

11

當您使用Auth類,你可以使用模擬它:

Auth::shouldReceive('attempt')->once()->andReturn(true) 

這樣你facade會被嘲笑!

希望它能幫助!