Как реализовать свой собственный провайдер Faker в Symfony

Чтобы уменьшить дублирование кода в моих классах фикстур, я хотел бы создать собственный провайдер для Faker (fakerphp/faker) в моем приложении Symfony 5. Где я могу создать собственный провайдер фейкеров в своем приложении? Обратите внимание, что я новичок в разработке на Symfony.

В связи с этой темой я нашел этот вопрос для Laravel, но, конечно же, у Symfony другая настройка проекта.

Читая документацию связанной библиотеки, я ожидаю, что я мог бы использовать $faker->addProvider(), но опять же, я не знаю, где этот код должен находиться в моем приложении Symfony.

Я фантазирую, что должен сделать сервис для этой функциональности, или, может быть, я должен просто добавить его в свой класс BaseFixture? Но это только дикие догадки для меня.


person Robin Bastiaan    schedule 11.03.2021    source источник


Ответы (1)


Куда вы поставите своего провайдера - вопрос субъективный. Некоторые используют src/Test/ (или пространство имен App\Test) для кода, связанного с тестами, который не является реальными тестами. Другие поместят его рядом с тестами где-нибудь в каталоге tests/, например. tests/Faker/ (с пространством имен App\Tests\Faker). Преимущество последнего в том, что классы будут подбираться только autoload-dev, а не в продакшене.

Что касается второй части вашего вопроса, как добавить провайдера в Faker, это зависит от того, как вы используете его в своих тестах или, точнее, хотите ли вы получить общий экземпляр подделки из своего контейнера или создать его вручную. Особенно, если ваш провайдер зависит от других сервисов, таких как Doctrine, вы, вероятно, захотите зарегистрировать его в контейнере или вам следует переосмыслить своего провайдера, поскольку использование базы данных может вызвать проблемы, например. когда вы сбрасываете свою тестовую базу данных, пул данных для вашего провайдера может исчезнуть.

Я бы предпочел создать экземпляр подделки в ваших тестах, поскольку стоимость запуска подделки относительно невелика, она не должна заметно замедлять ваши тесты, если выполняется несколько раз, и вам придется избегать привязки провайдера к службам из вашего производственного кода. случайно. У вас также будет больше контроля над тем, как вы создаете экземпляр фейкера и какие провайдеры вы хотите загрузить для конкретных тестов, если это важно для вас. Например, вы можете создать экземпляр в методе setUp ваших тестов:

class MyTest extends TestCase
{
    private $faker;

    protected function setUp(): void
    {
        // The Faker\Factory will create a ready to use Faker Generator
        $this->faker = Factory::create();
        $this->faker->addProvider(new MyCustomProvider());
    }

    public function testSomething(): void
    {
        $title = $this->faker->title;
    }
}

Фабрика создаст новый Faker\Generator со всеми уже зарегистрированными провайдерами по умолчанию. Вы можете просмотреть код , если хотите скорее иметь только своих собственных провайдеров. Вместо того, чтобы копировать этот код в каждом тесте, вы можете поделиться им, например. создав свой собственный класс TestCase, расширяемый вашими тестами, вместо того, который предоставляется PHPUnit, или вы можете использовать трейт. Я думаю, что любой подход хорош, но, возможно, у вас есть собственный базовый TestCase, если вы еще не знакомы с Traits.

С помощью описанного выше метода setUp вы также можете посмотреть, , как работает сервисный контейнер Symfony, особенно как создать сервисы через фабрику, а затем, например, создайте config/services_test.yaml, где вы создадите поддельный экземпляр, который вы можете получить в тестах, расширяющих WebTestCase или KernelTestCase после загрузки вашего ядра Symfony.

person dbrumann    schedule 11.03.2021