2015-02-10 50 views
0

我正在嘗試爲幾個控制器操作編寫phpunit測試。一切似乎都很好,除了嘲笑密碼外觀。嘲諷Laravel 4中的密碼門面

其中一個動作(「忘記密碼」)是這樣的:

if (Auth::check()) 
    //return a redirect since the user is already logged in 

switch ($response = Password::remind(Input::only('email'))) 
{ 
    case Password::INVALID_USER: 
     //return a redirect with error messages 

    case Password::REMINDER_SENT: 
     //return a redirect with success message flushed 
} 

兩個驗證和密碼是門面,默認配備了Laravel。

測試Auth::check()部分工作得很好:

Auth::shouldReceive('check')-> 
    once()-> 
    andReturn(false); //or true depending on my test case 

但是,當我嘗試Password::remind()同樣嘗試把它不起作用:

Password::shouldReceive('remind')-> 
    once()-> 
    andReturn(Password::INVALID_USER); 

我得到「SQLSTATE訪問被拒絕」異常這意味着應用程序正試圖訪問數據庫。

我也嘗試添加with(array())到我的測試,甚至綁定Mockery::mock('\Illuminate\Auth\Reminders\PasswordBroker') - 這一切都沒有幫助。

如何測試此控制器的動作?爲什麼密碼外觀與Auth不同?我還應該嘗試什麼?

謝謝

回答

0

所以我做了一些更多的搜索,編碼和調查。儘管它應該按照我第一次打算的方式工作,但我終於成功了。

我在Laravel的文檔中看到,調用Facade::shouldReceive('method')應該返回一個Mockery對象。所以我在我的測試中試過這個:

var_dump(get_class(Auth::shouldReceive('check'))); 
var_dump(get_class(Password::shouldReceive('remind'))); 

第一個按預期工作,但密碼不是。所以在閱讀了網頁之後,我走過了Laravel門面和服務提供商,終於找到了一些東西。

我嘲笑一個PasswordBroker對象(這就是密碼外觀指的是什麼)和「介紹它」給IoC。

$this->authReminder = Mockery::mock('Illuminate\Auth\Reminders\PasswordBroker'); 
App::instance('auth.reminder', $this->authReminder); 

再後來我使用這個對象而不是密碼門面是這樣的:

$this->authReminder-> 
    shouldReceive('remind')-> 
    once()-> 
    andReturn(Password::INVALID_USER); 

我知道這並不能回答爲什麼門面嘲諷不使用密碼工作,但至少要經過很多幾個小時的掙扎我可以寫出我需要的測試,並繼續進行項目。