Я пытаюсь использовать фабрику данных для тестирования Codeception, как указано здесь в приложении Symfony 4 с Doctrine. Все хорошо настроено, и модуль Codecption способен хранить фальшивые данные, которые были сгенерированы на заводе Factory Muffin.
Однако мне нужно создать модель для сущности, которая зависит от нескольких других сущностей. Поэтому я даю ссылку в модели на другие определения модели, например 'country' => 'entity|' . WorldCountry::class
.
Проблема в том, что больше моделей зависят от определения страны мира. Поэтому, когда я звоню $I->have(Warehouse::class)
, тестировщик пытается сохранить Warehouse, для чего ему нужно создать филиал, который в дальнейшем должен создать компанию. Оба из них зависят от модели страны мира.
Короче говоря, модель генерируется несколько раз, и она также пытается сохранить ее несколько раз. Тем не менее, сущность страны определяет уникальные ограничения для нескольких столбцов, и поэтому она завершается ошибкой с Doctrine\DBAL\Exception\UniqueConstraintViolationException
.
У меня вопрос: есть ли способ заставить Codecption сохранять модель только один раз, даже если модель вызывается несколько раз?
Ниже приведено примерное определение теста.
/**
* @var League\FactoryMuffin\Factory
*/
private $factory;
private $em;
public function _beforeSuite($settings = [])
{
/** @var Doctrine2 $doctrine */
try {
$this->factory = $this->getModule('DataFactory');
$this->em = $this->getModule('Doctrine2')->_getEntityManager();
} catch (ModuleException $e) {
$this->fail('Unable to get modules');
}
$this->stubWorldCountry();
$this->stubCompany();
$this->stubCompanyBranch();
$this->stubWarehouse();
}
private function stubWorldCountry()
{
$this->factory->_define(WorldCountry::class, [
'title' => Faker::name(),
'alpha2' => self::randomString(2),
]);
}
private function stubCompany()
{
$this->factory->_define(Company::class, [
'name' => Faker::name(),
'country' => 'entity|' . WorldCountry::class
]);
}
private function stubCompanyBranch()
{
$this->factory->_define(CompanyBranch::class, [
'name' => Faker::name(),
'country' => 'entity|' . WorldCountry::classs,
'company' => 'entity|' . Company::class
]);
}
private function stubWarehouse()
{
$this->factory->_define(Warehouse::class, [
'name' => Faker::name(),
'description' => Faker::sentence(6),
'branch' => 'entity|' . CompanyBranch::class
]);
}