Laravel Redirect :: back () — & gt; withErrors () не работает в тесте

Ладно, у меня возникли серьезные проблемы с написанием функционального теста для входа в систему с «неверными учетными данными», то есть с отсутствующим паролем

Для фона вот моя конфигурация маршрута:

Route::get('login', array('as' => 'login', 'uses' => 'SessionController@create'));
Route::resource('session', 'SessionController');

Вот содержимое в моем методе SessionController :: store ():

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());
}

}

Вышеуказанный контроллер store () прекрасно работает в браузере (!), Когда я отправляю форму с действием POST в / session. Выдается ошибка проверки формы, и меня перенаправляют обратно в / login с переменной $ errors, на мой взгляд, правильно заполненной соответствующим сообщением («Поле пароля обязательно»):

@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, а затем создаю / POST для SessionController :: store () с отсутствующими учетными данными, что приводит к ошибке проверки и перенаправлению обратно на / login. Пока все хорошо, но когда я следую за этим перенаправлением назад, я просматриваю обработанный контент страницы входа в систему / HTML, и у меня не установлена ​​переменная $ errors и, следовательно, нет сообщений, доступных в сеансе / отображаемых на странице.

Кто-нибудь может посоветовать, что может происходить?

Заранее спасибо.

1

Решение

Я не профессионал в функциональном тестировании, но я думаю, что вы можете попытаться найти свой HTML-код ошибки в HTML-файле, используя объект-обходчик, а не $ this. Когда вы делаете:

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

Для меня это значит, что теперь у сканера есть сгенерированный HTML путем перенаправления.

Надеюсь, поможет

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]