【问题标题】:One-To-Many relationships with FactoryMuffin in php?php中与FactoryMuffin的一对多关系?
【发布时间】:2015-02-16 18:38:23
【问题描述】:

我正在尝试使用 FactoryMuffin,一个类似于 FactoryGirl 的 php 工厂库,为我的集成测试生成测试数据。

在我的应用程序中,Person 可以有多个 Emails 和多个 Tokens。我想在我的工厂中生成一个Person,其中包含五个Emails 和一个Token,并围绕它编写一些测试。

目前,我正在这样定义我的工厂:

FactoryMuffin::define('Person')->setDefinitions([
    'id'         => Faker::numberBetween(123456789, 987654321),
    'name'      => Faker::name()
]);

FactoryMuffin::define('Email')->setDefinitions([
    'id'         => Faker::numberBetween(123456789, 987654321),
    'address'      => Faker::email(),
    'person_id' => 'factory|Person',

]);

FactoryMuffin::define('Token')->setDefinitions([
    'token'         => Faker::numberBetween(1234567891234, 9876543211234),
    'person_id' => 'factory|Person',

]);

我的问题是,当我创建Person 时,它不会创建任何关联的Emails 或Tokens。当我创建一个Token 时,它会自动创建一个Person,但没有关联的Emails。

我该如何处理?

【问题讨论】:

    标签: php testing integration-testing factory-bot factory


    【解决方案1】:

    根据 Factory Muffin 的工作方式,您无需创建人员。您可以简单地创建电子邮件并访问电子邮件创建的人(反之亦然)。在下面的示例中,我们创建了一条消息,然后访问该消息为我们创建的用户。

    从他们的docs 考虑这个例子。

    $message = FactoryMuffin::create('Message');
    $this->assertInstanceOf('Message', $message);
    $this->assertInstanceOf('User', $message->user);
    

    在您的情况下,您可以创建一个Email 并访问Person,如下所示

    $email = FactoryMuffin::create('Email');
    $emailPerson = $email->person;
    

    您甚至可以更进一步,像这样为同一个人创建 100 封电子邮件和 50 个令牌

    $person = FactoryMuffin::create('Person');
    $emails = FactoryMuffin::seed(100, 'Email', ['person_id' => $person->id]);
    $tokens = FactoryMuffin::seed(50, 'Token', ['person_id' => $person->id]);
    

    【讨论】:

    • 谢谢!这就是我最终要做的事情,尽管实际上我的数据库架构比这要复杂得多,而且让所有工厂按顺序排列的代码仍然有点脏
    猜你喜欢
    • 2015-11-05
    • 2018-03-16
    • 2018-12-07
    • 1970-01-01
    • 2012-06-14
    • 2011-06-22
    • 2018-11-02
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多