Вернуть экземпляр модели из контроллера в тестовый класс в laravel
Я тестирую юнит в Laravel с Phpunit. Ситуация такова, что я должен вернуть экземпляр модели из контроллера обратно в класс тестирования. Там я буду использовать атрибуты этого объекта для проверки утверждения. Как я могу этого достичь?
В настоящее время я кодирую этот экземпляр в ответ. И использовать его таким образом, который работает, но уродливо. Нужен более четкий путь.
Это мой тестовый класс:
/** @test
*/
function authenticated_user_can_create_thread()
{
//Given an authenticated user
$this->actingAs(factory('App\User')->create());
//and a thread
$thread = factory('App\Thread')->make();
//when user submits a form to create a thread
$created_thread = $this->post(route('thread.create'),$thread->toArray());
//the thread can be seen
$this->get(route('threads.show',['channel'=>$created_thread->original->channel->slug,'thread'=>$created_thread->original->id]))
->assertSee($thread->body);
}
и это метод контроллера:
public function store(Request $request)
{
$thread = Thread::create([
'user_id'=>auth()->id(),
'title'=>$request->title,
'body'=>$request->body,
'channel_id'=>$request->channel_id,
]);
if(app()->environment() === 'testing')
{
return response()->json($thread); //if request is coming from phpunit/test environment then send back the creted thread object as part of json response
}
else
return redirect()->route('threads.show',['channel'=>$thread->channel->slug,'thread'=>$thread->id]);
}
Как вы можете видеть в тестовом классе, я получаю объект, возвращенный из контроллера, в переменную $ creation_thread. Однако контроллер возвращает экземпляр Illuminate \ Foundation \ Testing \ TestResponse, так что THREAD, встроенный в этот ответ, не легко извлечь. Вы можете видеть, что я делаю -> $create_thread->original-> channel-> slug, 'thread' => $ made_thread->original-> id]. Но я уверен, что есть лучший способ добиться того же.
Кто-нибудь может направить меня в правильном направлении?
1 ответ
PHPUnit - это пакет модульного тестирования, отсюда и название. Модульное тестирование - это, по определению, написание тестов для каждого модуля, то есть для каждого класса, каждого метода, как можно более отдельно от каждой другой части системы. Каждую вещь, которую могут использовать пользователи, вы хотите попробовать проверить, что она - и только она, помимо всего прочего - функционирует так, как указано.
Ваша проблема в том, что тестировать нечего. Вы не создали ни одного метода с логикой, который можно было бы проверить. Тестировать действия контроллеров бессмысленно, так как они только доказывают, что контроллеры работают, что проверяют создатели Laravel.