У меня есть тест в Laravel 5.7, который проходит в 90% случаев.
иногда это не удается, и это потому, что между created_at и updated_at есть секунда:
В БД:
"created_at" => "2019-01-23 18:27:36"
"updated_at" => "2019-01-23 18:27:37"
Внутри локальной настройки $setting:
"created_at" => "2019-01-23 18:27:36"
"updated_at" => "2019-01-23 18:27:36"
мой тест:
/** @test */
public function it_update_setting_for_championship()
{
$tournament = factory(Tournament::class)->create();
$championship = factory(Championship::class)->create(['tournament_id' => $tournament->id, 'category_id' => 2]);
$setting = factory(ChampionshipSettings::class)->create(['championship_id' => $championship->id]);
$this->call('PUT', '/championships/' . $championship->id . '/settings/' . $setting->id, $setting->toArray());
$this->assertResponseOk();
$this->seeInDatabase('championship_settings', $setting->toArray());
}
Конечно, я мог бы поместить $setting->toArray() в переменную и unsetcreated_at и updated_at, но это неправильно...
Почему это происходит не всегда?
У кого-нибудь есть лучшее решение?
Обновлено:
Завод настроек чемпионата:
$factory->define(ChampionshipSettings::class, function (Faker\Generator $faker) use ($factory) {
$tcs = Championship::all()->pluck('id')->toArray();
return [
'championship_id' => $faker->randomElement($tcs),
'teamSize' => $faker->numberBetween(0, 6),
'fightingAreas' => $faker->numberBetween(0, 4),
'fightDuration' => "03:00",
'hasPreliminary' => $faker->boolean(),
'preliminaryWinner' => $faker->numberBetween(1, 2),
'hasEncho' => $faker->boolean(),
'enchoQty' => $faker->numberBetween(0, 4),
'enchoDuration' => "01:00",
'hasHantei' => $faker->boolean(),
'cost' => $faker->numberBetween(0, 100),
'preliminaryGroupSize' => $faker->numberBetween(0, 10),
'preliminaryDuration' => $faker->numberBetween(0, 10),
'seedQuantity' => $faker->numberBetween(0, 4),
'hanteiLimit' => $faker->numberBetween(0, 10), // 1/2 Finals
'enchoGoldPoint' => $faker->numberBetween(0, 10), // Step where Encho has no more time limit
'limitByEntity' => $faker->numberBetween(0, 10),
];
});
отредактировал ChampionshipSettingsFactory! в моей модели я защитил $dates = ['created_at', 'updated_at'];






Ваша проблема в том, как вы управляете своей фабрикой. Вы создаете элемент в своей базе данных, а затем перезаписываете значение после его создания.
Странный галтель с фабриками заключается в том, что они всегда будут запускать фабричный код, а затем применять перезаписанные вами данные, если только вы не используете функцию в качестве значения в паре key => value.
Измените свой factory на приведенный ниже, чтобы вместо этого вы использовали функцию для своего идентификатора:
$factory->define(ChampionshipSettings::class, function (Faker\Generator $faker) {
return [
'championship_id' => function() {
// Setting the id to a function makes it so the below query doesn't run
// If we do an overwrite when we are using this factory.
return Championship::inRandomOrder()->first()->id
},
'teamSize' => $faker->numberBetween(0, 6),
'fightingAreas' => $faker->numberBetween(0, 4),
'fightDuration' => "03:00",
'hasPreliminary' => $faker->boolean(),
'preliminaryWinner' => $faker->numberBetween(1, 2),
'hasEncho' => $faker->boolean(),
'enchoQty' => $faker->numberBetween(0, 4),
'enchoDuration' => "01:00",
'hasHantei' => $faker->boolean(),
'cost' => $faker->numberBetween(0, 100),
'preliminaryGroupSize' => $faker->numberBetween(0, 10),
'preliminaryDuration' => $faker->numberBetween(0, 10),
'seedQuantity' => $faker->numberBetween(0, 4),
'hanteiLimit' => $faker->numberBetween(0, 10), // 1/2 Finals
'enchoGoldPoint' => $faker->numberBetween(0, 10), // Step where Encho has no more time limit
'limitByEntity' => $faker->numberBetween(0, 10),
];
});
Итак, теперь, когда вы запускаете:
$setting = factory(ChampionshipSettings::class)->create([
'championship_id' => $championship->id
]);
Вы больше не будете выполнять запрос для перехода к базе данных для поиска идентификаторов чемпионата, даже если вы перезаписываете их, как показано выше.
Этот метод упоминается (с небольшими подробностями о том, почему) в документах здесь: https://laravel.com/docs/5.7/database-testing#relationships
Дайте мне знать, если проблема все еще возникает.
Используете ли вы метки времени в своей модели чемпионата? Можете ли вы также показать нам свою фабрику
ChampionshipSettings?