Factory Girl + Mongoid 在夹具中嵌入文档

Posted

技术标签:

【中文标题】Factory Girl + Mongoid 在夹具中嵌入文档【英文标题】:Factory Girl + Mongoid embedded documents in fixtures 【发布时间】:2011-11-24 01:32:14 【问题描述】:

假设您有以下 mongoid 文档:

class User
    include Mongoid::Document
    embeds_one :name
end

class UserName
    include Mongoid::Document
    field :first
    field :last_initial

    embedded_in :user
end

如何创建一个工厂女孩工厂来初始化嵌入的名字和姓氏首字母?另外,您将如何处理 embeds_many 关系?

【问题讨论】:

【参考方案1】:

我也在寻找这个,在研究过程中,我偶然发现了很多代码并将它们拼凑在一起(但我希望有更好的文档),但这是我的部分代码。 Address 是 1..1 关系,Phones 是 1..n 关系到事件。

  factory :event do
    title     'Example Event'

    address   FactoryGirl.build(:address) 
    phones     [FactoryGirl.build(:phone1), FactoryGirl.build(:phone2)] 
  end

  factory :address do
    place     'foobar tower'
    street    'foobar st.'
    city      'foobar city'
  end

  factory :phone1, :class => :phone do
    code      '432'
    number    '1234567890'
  end

  factory :phone2, :class => :phone do
    code      '432'
    number    '0987654321'
  end

(对不起,如果我不能提供我的链接,他们有点搞砸了)

【讨论】:

谢谢。我只是浪费了几个小时来追踪这个问题。 请注意,phones 属性是一个数组(FactoryGirl 调用被 [] 包围)。您不需要多个 :phone,但如果关系是 embeds_many,它必须是一个数组。这个细节花了我大约 4 个小时!【参考方案2】:

这是一个允许您动态定义嵌入对象数量的解决方案:

FactoryGirl.define do
  factory :profile do
    name 'John Doe'
    email 'john@bigcorp.com'
    user

    factory :profile_with_notes do
      ignore do
        notes_count 2
      end

      after(:build) do |profile, evaluator|
        evaluator.notes_count.times do
          profile.notes.build(FactoryGirl.attributes_for(:note))
        end
      end
    end
  end
end

这允许您调用 FactoryGirl.create(:profile_with_notes) 并获得两个嵌入的注释,或者调用 FactoryGirl.create(:profile_with_notes, notes_count: 5) 并获得五个嵌入的注释。

【讨论】:

以上是关于Factory Girl + Mongoid 在夹具中嵌入文档的主要内容,如果未能解决你的问题,请参考以下文章

在 factory_girl 中填充与儿童的关联

在具有唯一约束的关联中使用 Rails 中的 factory_girl。得到重复的错误

ruby enable_factory_girl_on_dev.rb

跳过 Factory Girl 和 Rspec 的回调

如果我调用 Factory.build 以使我的控制器测试快速,如何让 Factory Girl 永远不会访问数据库?

Rails 4 使用 Engine 中的 Factory Girl 工厂