#php #laravel #laravel-5.6 #laravel-testing
#php #laravel #laravel-5.6 #laravel-тестирование
Вопрос:
Я прохожу тестирование своего приложения, и я дошел до того, что мне нужно протестировать метод уничтожения моего контроллера. Тест, который у меня есть на данный момент, является:
public function test_user_can_delete_draft()
{
$user = factory(User::class)->states('confirmed', 'normaluser')->create();
$userForm = factory(Form::class)->states('in_house_signs')->create(['user_id' => $user->id, 'status' => 'draft',]);
// Test creator can delete form
$response = $this->actingAs($user)->delete(route('forms.destroy', $userForm));
$response->assertSuccessful();
}
И метод в контроллере, который я тестирую, является:
public function destroy($id) {
$form = Form::find($id);
Comment::where('form_id', $id)->delete();
$form->delete();
// Redirect
return redirect()->back()->with('status', 'Form successfully deleted');
}
Когда я запускаю phpunit, я получаю сообщение об ошибке:
Response status code [302] is not a successful status code.
Failed asserting that false is true.
Что я должен сделать, чтобы тест выполнялся должным образом?
Ответ №1:
вы могли бы попробовать использовать assertRedirect
https://laravel.com/docs/5.6/http-tests#assert-redirect
или используйте проверку состояния:
$response->assertStatus(302)
https://laravel.com/docs/5.6/http-tests#assert-status
или, если вы действительно хотите проверить, удаляется ли запись, вы могли бы проверить базу данных в своем тесте, удалена ли запись $this->assertEquals(Comment::where('form_id', $userForm->id)->first(),null)
Комментарии:
1. Я сменил свой контроллер с redirect()-> back на redirect()-> route и изменил тест на match, и теперь он проходит! Спасибо за совет!
Ответ №2:
Вы используете $response->assertSuccessful();
и перенаправляете пользователя, я имею в виду, что если ваш запрос на удаление будет успешным, он вернет 302 перенаправления, измените assertSuccessful()
на assertStatus(302)