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/login을 실행 한 후 SessionController :: store()에/POST를 실행하면 누락 된 자격 증명으로 인해 유효성 검사 오류가 발생하고/login으로 다시 리디렉션됩니다. 지금까지는 괜찮 았지만이 리다이렉트를 따라 가면 렌더링 된 로그인 페이지 content/HTML 내에서 볼 수 있으며 $ errors 변수가 없으므로 세션에서 사용 가능한 메시지가 없거나 페이지에 표시됩니다.

무슨 일이 일어날 지 조언 해줄 사람이 있습니까?

미리 감사드립니다.

답변

1

나는 기능 테스트에서 프로가 아니지만 제 생각에는 HTML에서 크롤러 개체를 사용하는 오류 HTML 코드를 찾고 $ this가 아닌 것입니다. 수행 할 작업 :

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

이제는 크롤러가 리디렉션을 통해 생성 된 HTML을 갖습니다.

희망 하시겠습니까?

+0

감사합니다. elfif. 나는 당신의 제안을 이미 다음과 같이 시도했다. (경고 상자 div에 오류 메시지가 표시된다.) $ this-> assertCount (1, $ crawler-> filter ("div.alert-box")); 이것은 false를 반환합니다 (경고 상자가 내용에 없음). 만약 $ this-> client-> getResponse() -> getContent()를 사용하면 오류 메시지가 표시되지 않습니다. 플래시 세션을보기 전에 제거되는 오류와 비슷합니까? – drj201

+0

javascript가 크롤러 AFAIK에 의해 해석되지 않기 때문에 크롤러를 사용하여 콘텐츠를 삭제할 수 없습니다. 처음부터 콘텐츠가 존재하거나 그렇지 않습니다. – elfif

관련 문제