我正在研究在Codeception中使用DataFactory来播种数据,并用于我们的验收测试。在文档中提到了 2 种方法,一种使用帮助程序文件,另一种使用工厂文件。
我们使用acceptance.suite.yml
中的此代码段加载这两个选项
class_name: AcceptanceTester
modules:
enabled:
- Db
- WebDriver
- HelperAcceptance
- Doctrine2:
connection_callback: getEntityManager
- DataFactory:
factories: tests/_support/factories
depends: Doctrine2
- HelperFactory
这两个选项似乎都正确加载。根据文档,我可以像这样定义工厂,这将允许与 Doctrine 进行交互。
// tests/_support/Helper/Factory.php
class Factory extends Module
{
/**
* @param array $settings
* @throws LeagueFactoryMuffinExceptionsDefinitionAlreadyDefinedException
* @throws CodeceptionExceptionModuleException
*/
public function _beforeSuite($settings = [])
{
/** @var ModuleDataFactory $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 LeagueFactoryMuffinFakerFaker;
/** @var LeagueFactoryMuffinFactoryMuffin $fm */
$user = $fm->create(User::class);
dd($user);
但是,seed.php
版本似乎无法共享工厂,并且出现以下错误:
模型定义"用户"未定义。
我想知道是否可以通过将工厂.php逻辑移动到initialize()
方法来解决,但这似乎是在工厂松饼被启动之前调用的。
codeception的文档似乎有点稀疏,FactoryMuffin文档虽然更好,但不包括Codeception集成。只是想弄清楚我是否遗漏了什么,或者如果我想同时使用两个文件/方法,我只需要在每个地方重复代码。
这是一个古老的问题,技术发展很快,因此自最初提出以来,文档可能已经更改,但我会尝试以防其他人像我一样偶然发现它。
您正在使用数据工厂模块,该模块很棒,因为它带有开箱即用的Codeception集成。您介绍的两种方法实际上是将数据工厂与数据集成的方法。通过创建工厂文件,你为数据工厂提供了一种生成数据的方法。但是,如果数据库中已经有一些数据也想在测试中使用,该怎么办?这就是使用 Helper 类的位置。根据数据工厂模块文档:
如果要在工厂定义中使用数据库中的数据,可以在帮助程序中定义它们。例如,如果您使用Doctrine,则允许您访问定义中的
EntityManager
。
至于您seed.php
找不到用户模型的问题,您需要根据工厂中给出的定义进行指定。例如,如果您的工厂文件如下所示
<?php
use LeagueFactoryMuffinFakerFacade as Faker;
$fm->define('appmodelsUser')->setDefinitions([
'name' => Faker::name(),
... // the rest of your properties here
]);
然后种子.php看起来像
// tests/_support/factories/seed.php
use LeagueFactoryMuffinFakerFaker;
$user = $fm->create('appmodelsUser');
安装和配置数据工厂模块后,只需通过have
、haveMultiple
或make
在相应的测试套件中调用它即可。请参阅Codeception Docs