Factory Girl + Mongoid встраивает документы в светильники - PullRequest
36 голосов
/ 24 сентября 2011

Допустим, у вас есть следующие документы 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?

Ответы [ 2 ]

63 голосов
/ 04 октября 2011

Я также искал этот, и, исследуя, я наткнулся на большое количество кода и соединил их все вместе (хотя я хотел бы, чтобы были лучшие документы), но вот моя часть кода.Адрес - это отношение 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

(И извините, если я не могу предоставить свои ссылки, они были немного испорчены)

6 голосов
/ 22 августа 2013

Вот решение, которое позволяет вам динамически определять количество вложенных объектов:

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) и получить пятьвстроенные заметки.

...