我正在尝试使用Data Factory在带有Doctrine的Symfony 4应用程序中对here进行概述的Codeception测试。一切都配置良好,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
]);
}