0

好吧,我爲編寫「不正確憑據」登錄名的功能測試出現了麻煩,即缺少密碼。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變量集,因此在會話中沒有可用的消息/顯示在頁面中。

任何人都可以建議可能發生什麼?

在此先感謝。

回答

1

我不是專業的功能測試,但我的猜測是你可能會嘗試使用爬蟲對象而不是$ this在HTML中找到錯誤的HTML代碼。當你這樣做:

$ crawler = $ this-> client-> followRedirect();

對我來說意味着現在抓取工具已經通過重定向生成了HTML。

希望它有幫助

+0

謝謝elfif。我已經嘗試了以下建議(錯誤消息顯示在警告框div中): $ this-> assertCount(1,$ crawler-> filter(「div.alert-box」)); 這將返回false(警報框不在內容中)。如果我只是$ this-> client-> getResponse() - > getContent(),那麼也不會顯示錯誤消息。這就像錯誤閃光會議被刪除之前,我可以查看它? – drj201 2014-09-20 08:44:29

+0

使用爬行器無法刪除內容,因爲檢索器AFAIK未對JavaScript進行解釋。它要麼是從一開始就存在的內容,要麼是不存在的內容。 – elfif 2014-09-21 20:56:44

相關問題