帮助程序和其他工厂之间的Codeception DataFactory交互

时间:2018-01-11 12:46:17

标签: php testing codeception acceptance-testing factorymuffin

我正在考虑在Codeception中使用DataFactory来播种数据,并在我们的验收测试中使用。在文档中提到了两种方法,一种使用帮助文件,另一种使用工厂文件。

我们使用acceptance.suite.yml

中的此代码段加载这两个选项
class_name: AcceptanceTester
modules:
    enabled:
        - Db
        - WebDriver
        - \Helper\Acceptance
        - Doctrine2:
            connection_callback: getEntityManager
        - DataFactory:
            factories: tests/_support/factories
            depends: Doctrine2
        - \Helper\Factory

两个选项似乎都正确加载。根据{{​​3}},我可以定义这样的工厂,这将允许与Doctrine进行交互。

// tests/_support/Helper/Factory.php
class Factory extends Module
{

    /**
     * @param array $settings
     * @throws \League\FactoryMuffin\Exceptions\DefinitionAlreadyDefinedException
     * @throws \Codeception\Exception\ModuleException
     */
    public function _beforeSuite($settings = [])
    {
        /** @var Module\DataFactory $factory */
        $factory = $this->getModule('DataFactory');

        /** @var EntityManager $em */
        $em = $this->getModule('Doctrine2')->_getEntityManager();

        $factory->_define(User::class,[
            // generate random user name
            'name' => Faker::name(),
        ]);
        parent::_beforeSuite($settings);
    }
}

根据另一个选项,我也可以通过加载tests/_support/factories中的所有文件来创建工厂,如下所示:

// tests/_support/factories/seed.php
use League\FactoryMuffin\Faker\Faker;

/** @var \League\FactoryMuffin\FactoryMuffin $fm */
$user = $fm->create(User::class);
dd($user);

但是,seed.php版本似乎无法共享Factory,并且出现以下错误:

  

模型定义'用户'未定义。

我想知道是否可以通过将Factory.php逻辑移动到initialize()方法来解决这个问题,但这似乎是在FactoryMuffin初始化之前调用的。

带有代码的文档似乎有点稀疏,而FactoryMuffin文档虽然更好,但不包括Codeception集成。如果我错过了某些东西,只是想弄清楚,或者如果我想使用这两个文件/方法,我只需要在每个地方重复代码。

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,技术发展迅速,因此自最初提出要求以来,文档可能已更改,但我会尝试一下,以防其他人像我一样偶然发现它。

您正在使用DataFactory模块,它非常有用,因为它具有开箱即用的Codeception集成。您描述的两种方法实际上是将DataFactory与数据集成的方法。通过创建工厂文件,您为DataFactory提供了一种生成数据的方法。但是,如果数据库中已经有一些数据想要在测试中使用,该怎么办?那就是您要使用Helper类的地方。根据{{​​3}}文档:

如果要在工厂定义内使用数据库中的数据,可以在Helper中进行定义。例如,如果您使用Doctrine,则可以使用它在定义内访问EntityManager

对于seed.php找不到用户模型的问题,您需要根据工厂给出的定义进行指定。例如,如果您的工厂文件看起来与此类似

<?php
use League\FactoryMuffin\Faker\Facade as Faker;
$fm->define('app\models\User')->setDefinitions([
        'name' => Faker::name(),
        ... // the rest of your properties here
    ]);

然后seed.php看起来像

// tests/_support/factories/seed.php
use League\FactoryMuffin\Faker\Faker;

$user = $fm->create('app\models\User');

一旦安装并配置了DataFactory模块,您就可以在相应的测试套件中通过havehaveMultiplemake对其进行调用。参见DataFactory Module