Я бы подтвердил ответ на запрос, и, поскольку это запрос, я бы также сделал утверждение кода состояния ответа. Я сделал бы это следующим образом:
<?php
public function test_index_default_order_by_online_status()
{
$film1 = factory(Film::class)->create([
'status' => FilmStatus::OFFLINE
]);
$film2 = factory(Film::class)->create([
'status' => FilmStatus::ONLINE
]);
$this
->json('GET', '/films')
->assertOk() // assert the response have status code 200
->assertJson([ // assert the order
$film2, // film2 goes first since you ordered by created_at desc
$film1
]);
}
Вы должны помнить о json, который вы здесь утверждаете, так как вы могли бы вернуть результат в другом формате, используя преобразователь. Поэтому было бы лучше, если бы вы преобразовали результат в тот же формат, который вы использовали на контроллере до подтверждения. Например:
<?php
public function test_index_default_order_by_online_status()
{
$film1 = factory(Film::class)->create([
'status' => FilmStatus::OFFLINE
]);
$film2 = factory(Film::class)->create([
'status' => FilmStatus::ONLINE
]);
// parse the result
$result = $this->getExpectedResult([$film2, $film1]);
$this
->json('GET', '/films')
->assertOk() // assert the response
->assertJson($result);
}
private function getExpectedResult($data) {
return fractal($data, new FilmTransformer())->toArray();
}
Другая вещь, которую вы должны принять к сведению, - это атрибут updated_at
, с которым вы сортируете. Хотя $film1
и $film2
создаются по порядку, однако из-за скорости выполнения теста updated_at
может быть непоследовательным, что приведет к сбою теста. Поэтому я бы посоветовал отрегулировать время создания до вашего теста.
Я собираюсь использовать метод setTestNow()
из Carbon
, чтобы мы могли манипулировать временем во время теста.
<?php
public function test_index_default_order_by_online_status()
{
// set $film1 creation time
Carbon::setTestNow(Carbon::create(2019, 1, 1, 11, 0, 0));
$film1 = factory(Film::class)->create([
'status' => FilmStatus::OFFLINE
]);
// set $film2 creation time
Carbon::setTestNow(Carbon::create(2019, 1, 1, 11, 59, 59));
$film2 = factory(Film::class)->create([
'status' => FilmStatus::ONLINE
]);
// reset the time
Carbon::setTestNow();
$result = $this->getExpectedResult([$film2, $film1]);
$this
->json('GET', '/films')
->assertOk() // assert the response
->assertJson($result);
}
Тем самым вы можете убедиться, что атрибут updated_at
будет другим.
Надеюсь, это поможет.