如何在Symfony 4中使用Codeception和DataFactory(使用FactoryMuffin)仅持久保存一次工厂数据

时间:2019-05-10 21:09:50

标签: symfony codeception

我正在尝试使用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
        ]);
    }

0 个答案:

没有答案