我正在考虑在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集成。如果我错过了某些东西,只是想弄清楚,或者如果我想使用这两个文件/方法,我只需要在每个地方重复代码。
答案 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模块,您就可以在相应的测试套件中通过have
,haveMultiple
或make
对其进行调用。参见DataFactory Module