SeeInDatabase иногда дает сбой из-за полей updated_at через 1 секунду

У меня есть тест в 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),
    ];
});

Используете ли вы метки времени в своей модели чемпионата? Можете ли вы также показать нам свою фабрику ChampionshipSettings?

hdifen 23.01.2019 19:53

отредактировал ChampionshipSettingsFactory! в моей модели я защитил $dates = ['created_at', 'updated_at'];

Juliatzin 23.01.2019 19:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, как вы управляете своей фабрикой. Вы создаете элемент в своей базе данных, а затем перезаписываете значение после его создания.

Странный галтель с фабриками заключается в том, что они всегда будут запускать фабричный код, а затем применять перезаписанные вами данные, если только вы не используете функцию в качестве значения в паре 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

Дайте мне знать, если проблема все еще возникает.

Другие вопросы по теме