我正在研究如何使用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这两个选项似乎都正确加载。根据文档,我可以定义像这样的工厂,这将允许与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.php逻辑移动到initialize()方法来解决这个问题,但这似乎是在初始化FactoryMuffin之前调用的。
这方面的共同欺骗文档似乎有点稀疏,FactoryMuffin文档虽然更好,但不涉及协同欺骗集成。如果我想同时使用这两种文件/方法,我只需要在每个地方重复代码就可以了。
发布于 2020-03-17 17:18:40
这是一个古老的问题,技术进步很快,所以文档可能已经改变了,因为这是最初提出的,但我会尝试,以防其他人像我一样偶然发现它。
您使用的是DataFactory模块,这是非常棒的,因为它提供了集成,以便在开箱即用的情况下实现协同欺骗。您所描述的两种方法实际上是将DataFactory与数据集成的方法。通过创建工厂文件,您已经为DataFactory提供了一种生成数据的方法。但是,如果数据库中已经有一些您希望在测试中也使用的数据,该怎么办?你会在那里使用帮手课。根据DataFactory模块文档:
如果要在工厂定义中使用数据库中的数据,可以在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在适当的测试套件中调用它。见共骗文档
https://stackoverflow.com/questions/48207441
复制相似问题