Как сохранить заводские данные только один раз с Codeception и DataFactory (с FactoryMuffin) в Symfony 4 - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь использовать фабрику данных для тестирования 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
        ]);
    }
...