Я пытаюсь проверить некоторые из моих контроллеров с помощью модульного тестирования. Но происходит нечто странное. Со следующим кодом в моем тестовом примере:
public function test_username_registration_too_short()
{
$result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
'username' => 'foo'
]);
$this->assertEquals('not_saved', $result->getContent());
// $result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
// 'username' => 'foo'
// ]);
// $this->assertEquals('not_saved', $result->getContent());
}
public function test_username_registration_too_short_run_2()
{
$result = $this->action('POST', 'App\\Controllers\\API\\UserController@store', null, [
'username' => 'foo'
]);
$this->assertEquals('not_saved', $result->getContent());
}
Когда я запускаю это, первоначальный тест too_short проходит, но точно такой же код при запуске 2 не проходит (ему даже удается спасти пользователя). Но если я поместил один и тот же код дважды в одном и том же методе (что сейчас закомментировано), он работает отлично? У меня ничего нет в моих методах setUp или tearDown. И я немного потерян здесь.
Код в контроллере выглядит следующим образом:
$user = new User(Input::all());
if($user->save())
{
return 'saved';
}
return 'not_saved';
Я не собираюсь прекращать повторяться над этим вопросом. Есть аналогичный ответ на (несколько) похожий вопрос. TL; DR: не используйте модульное тестирование для функционального / интеграционного тестирования.
Это область функционального тестирования, и здесь есть потрясающие рамки
называется Бехат. Вы должны сделать свое собственное исследование, но по существу, пока
PHPUnit отлично подходит для тестирования более или менее независимых блоков
функциональность это отстой при тестировании больших вещей, как полный запрос
выполнение. Позже вы начнете испытывать проблемы с сессией
ошибки, неправильно настроенная среда и т. д., все потому, что каждый запрос
должен быть выполнен в своем собственном отдельном пространстве, и вы заставляете его
делать противоположное. Behat с другой стороны работает в очень
по-разному, где для каждого сценария (пост робот, просмотр несуществующего
страница), он отправляет новый запрос на сервер и проверяет результат.
Он в основном используется для окончательного тестирования всего, что работает вместе
делать утверждения о конечном результате (объект ответа / html / json).
Если вы хотите протестировать свой код надлежащим образом, подумайте об использовании правильных инструментов для этого. Когда вы разберетесь с Behat, вы влюбитесь в него + вы можете использовать PHPUnit из Behat, чтобы делать индивидуальные утверждения.
Других решений пока нет …