web-dev-qa-db-ja.com

Factory Girl +フィクスチャに埋め込まれた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の関係でどのようにそれを行いますか?

36
GTDev

私もこれを探していました。調査しているときに、たくさんのコードに出くわし、それらをすべてつなぎ合わせました(ただし、より良いドキュメントがあればいいのですが)が、ここにコードの一部があります。アドレスは1..1の関係であり、電話はイベントとの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

(そして、リンクを提供できない場合は申し訳ありませんが、それらはちょっとめちゃくちゃでした)

63
index

埋め込みオブジェクトの数を動的に定義できるソリューションは次のとおりです。

_FactoryGirl.define do
  factory :profile do
    name 'John Doe'
    email '[email protected]'
    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)を呼び出して2つの埋め込みメモを取得するか、FactoryGirl.create(:profile_with_notes, notes_count: 5)を呼び出して5つの埋め込みメモを取得できます。

6
emkman