首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮工与其他工厂之间的协同欺骗DataFactory交互

帮工与其他工厂之间的协同欺骗DataFactory交互
EN

Stack Overflow用户
提问于 2018-01-11 12:46:16
回答 1查看 711关注 0票数 2

我正在研究如何使用DataFactory中的协同欺骗来播种数据,并在我们的验收测试中使用。在文档中提到了两种方法,一种使用助手文件,另一种使用工厂文件。

我们使用acceptance.suite.yml中的这个片段加载这两个选项

代码语言:javascript
复制
class_name: AcceptanceTester
modules:
    enabled:
        - Db
        - WebDriver
        - \Helper\Acceptance
        - Doctrine2:
            connection_callback: getEntityManager
        - DataFactory:
            factories: tests/_support/factories
            depends: Doctrine2
        - \Helper\Factory

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

代码语言:javascript
复制
// 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中加载所有文件来创建工厂,如下所示:

代码语言:javascript
复制
// 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文档虽然更好,但不涉及协同欺骗集成。如果我想同时使用这两种文件/方法,我只需要在每个地方重复代码就可以了。

EN

回答 1

Stack Overflow用户

发布于 2020-03-17 17:18:40

这是一个古老的问题,技术进步很快,所以文档可能已经改变了,因为这是最初提出的,但我会尝试,以防其他人像我一样偶然发现它。

您使用的是DataFactory模块,这是非常棒的,因为它提供了集成,以便在开箱即用的情况下实现协同欺骗。您所描述的两种方法实际上是将DataFactory与数据集成的方法。通过创建工厂文件,您已经为DataFactory提供了一种生成数据的方法。但是,如果数据库中已经有一些您希望在测试中也使用的数据,该怎么办?你会在那里使用帮手课。根据DataFactory模块文档:

如果要在工厂定义中使用数据库中的数据,可以在Helper中定义这些数据。例如,如果使用Doctrine,则允许在定义中访问EntityManager

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

代码语言:javascript
复制
<?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看起来就像

代码语言:javascript
复制
// tests/_support/factories/seed.php
use League\FactoryMuffin\Faker\Faker;

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

一旦安装和配置了DataFactory模块,就可以通过havehaveMultiplemake在适当的测试套件中调用它。见共骗文档

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48207441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档