Ладно, у меня возникли серьезные проблемы с написанием функционального теста для входа в систему с «неверными учетными данными», то есть с отсутствующим паролем
Для фона вот моя конфигурация маршрута:
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 и, следовательно, нет сообщений, доступных в сеансе / отображаемых на странице.
Кто-нибудь может посоветовать, что может происходить?
Заранее спасибо.
Я не профессионал в функциональном тестировании, но я думаю, что вы можете попытаться найти свой HTML-код ошибки в HTML-файле, используя объект-обходчик, а не $ this. Когда вы делаете:
$ crawler = $ this-> client-> followRedirect ();
Для меня это значит, что теперь у сканера есть сгенерированный HTML путем перенаправления.
Надеюсь, поможет
Других решений пока нет …