好吧,我爲編寫「不正確憑據」登錄名的功能測試出現了麻煩,即缺少密碼。Laravel Redirect :: back() - > withErrors()在測試中不起作用
爲背景,這裏是我的路由配置:
Route::get('login', array('as' => 'login', 'uses' => '[email protected]'));
Route::resource('session', 'SessionController');
這裏是我的SessionController內容::店()方法:
public function store()
{
$credentials = Input::only('email', 'password');
try {
$this->loginForm->validate($credentials);
if (!Auth::attempt(array('email' => $credentials['email'], 'password' => $credentials['password']))) {
return Redirect::back()->exceptInput('password')->with('flash_message', 'Invalid credentials');
}
return Redirect::to('/')->with('flash_message', 'Welcome back');
}
catch (FormValidationException $e)
{
return Redirect::back()->exceptInput('password')->withErrors($e->getErrors());
}
}
上面存儲()控制器完美的作品在瀏覽器(!),當我提交一個POST動作到/ session的表單。表單驗證錯誤被關上,我重定向回/登錄,在我看來,有關消息正確填充變量$錯誤(「需要密碼字段」):試圖複製時
@foreach($errors->all() as $error)
{{ $error }}
@endforeach
然而上述功能測試中的預期工作行爲我有一個問題。這裏是我的測試的基本輪廓:
public function testIncorrectCredentialsLogin()
{
$this->client->request('GET', '/login');
$this->assertTrue($this->client->getResponse()->isOk());
$credentials = array(
'email' => '[email protected]',
'password' => ''
);
$this->client->request('POST', '/session', $credentials);
$this->assertRedirectedTo('login', array('errors'));
$crawler = $this->client->followRedirect();
$this->assertSessionHasErrors();
$this->assertHasOldInput();
$this->assertViewHas('errors'); // Fails
}
在我的功能測試中,我嘗試複製在瀏覽器中成功發生的事情。我先GET /登錄,然後用缺少的憑證對SessionController :: store()進行/ POST,導致驗證錯誤和重定向回到/ login。目前爲止還好,但是當我按照這個重定向返回時,我查看了呈現的登錄頁面內容/ HTML,並且沒有$ errors變量集,因此在會話中沒有可用的消息/顯示在頁面中。
任何人都可以建議可能發生什麼?
在此先感謝。
謝謝elfif。我已經嘗試了以下建議(錯誤消息顯示在警告框div中): $ this-> assertCount(1,$ crawler-> filter(「div.alert-box」)); 這將返回false(警報框不在內容中)。如果我只是$ this-> client-> getResponse() - > getContent(),那麼也不會顯示錯誤消息。這就像錯誤閃光會議被刪除之前,我可以查看它? – drj201 2014-09-20 08:44:29
使用爬行器無法刪除內容,因爲檢索器AFAIK未對JavaScript進行解釋。它要麼是從一開始就存在的內容,要麼是不存在的內容。 – elfif 2014-09-21 20:56:44