Куда вы поставите своего провайдера - вопрос субъективный. Некоторые используют 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