Фабрики моделей Laravel, использующие одно и то же семя для целей тестирования

Я пытаюсь настроить семя по умолчанию для Faker в Laravel, что обычно достигается таким образом (не в Laravel):

<?php
$faker = Faker\Factory::create();
$faker->seed(1234);

согласно странице GitHub Faker.

Я пытаюсь сделать это, чтобы каждый раз получать одни и те же данные, чтобы я мог написать несколько модульных тестов, но я понятия не имею, как это сделать в Laravel. Я проверил документацию Laravel и попытался найти проблему в Google, но ничего не нашел.


person Petar Vasilev    schedule 29.09.2017    source источник


Ответы (2)


Вот как применить семя к Faker в Laravel 5.

Внутри вашего каталога app/database/factories создайте новый файл. Я назвал свой SeedFactory.php.

<?php

$factory->faker->seed('1');

Вот и все!

Теперь у вас есть согласованные случайные данные для модульного тестирования!

Примечание. Если у вас есть только одна или две фабрики, вы можете добавить эту строку в существующий файл фабрики.


Вот почему это работает.

Когда Laravel обрабатывает все файлы в каталоге app/database/factories, он сразу их выполняет. Передаваемый объект $factory является экземпляром Illuminate\Database\Eloquent\Factory.php, который сохраняет свой собственный внутренний экземпляр Faker\Generator.

Кроме того, вам не нужно беспокоиться об именовании файла или порядке выполнения, потому что это будет запущено до любого из обратных вызовов фабрики (при условии, что вы сделали это в соответствии с инструкциями в документации Laravel).

person haz    schedule 06.06.2018

Это просто. Просто определите фабрику. Давайте посмотрим на фабрику по умолчанию, поставляемую с laravel 5.5.

Файл: база данных/фабрики/ModelFacotry.php

<?php

/*
|--------------------------------------------------------------------------
| Model Factories
|--------------------------------------------------------------------------
|
| Here you may define all of your model factories. Model factories give
| you a convenient way to create models for testing and seeding your
| database. Just tell the factory how a default model should look.
|
*/

/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\User::class, function (Faker\Generator $faker) {
    static $password;

    // Add this line to original factory shipped with laravel.
    $faker->seed(123);

    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => $password ?: $password = bcrypt('secret'),
        'remember_token' => str_random(10),
    ];
});

Затем используйте tinker, чтобы проверить это:

yudu@YududeMacBook-Pro ~/demo> php artisan tinker
Psy Shell v0.8.1 (PHP 7.1.8 — cli) by Justin Hileman
>>> $user = factory(App\User::class)->make()
=> App\User {#880
    name: "Jessy Doyle",
    email: "[email protected]",
}
>>> $user = factory(App\User::class)->make()
=> App\User {#882
    name: "Jessy Doyle",
    email: "[email protected]",
}

Документы Laravel:

как определить и использовать factory

Раздача

person sean xia    schedule 30.09.2017
comment
Это не сработало, как ожидалось. При создании более одного экземпляра фабрики создается один и тот же пользователь с тем же именем и адресом электронной почты, если вы не используете уникальную опцию. Есть ли способ избежать этого? - person Petar Vasilev; 01.10.2017
comment
Чтобы продолжить предыдущий комментарий - даже с unique() он не генерирует те же записи: ( - person Petar Vasilev; 01.10.2017
comment
@PetarVasilev извините за опоздание. Без unique() вы получите те же данные фейкера. - person sean xia; 05.10.2017
comment
Это решение не будет работать должным образом. Вместо создания базы данных, полной случайных имен и адресов электронной почты, он создаст базу данных, полную точно таких же случайных имен и адресов электронной почты. Если вы используете unique() в адресе электронной почты, вы не сможете постоянно проверять значение этого адреса электронной почты. - person haz; 06.06.2018