Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Factory Girl + Mongoid embedded documents in fixtures

Let’s say you have the following mongoid documents:

class User     include Mongoid::Document     embeds_one :name end  class UserName     include Mongoid::Document     field :first     field :last_initial      embedded_in :user end 

How do you create a factory girl factory which initializes the embedded first name and last initial? Also how would you do it with an embeds_many relationship?

like image 731
GTDev Avatar asked Sep 24 '11 00:09

GTDev


2 Answers

I was also looking for this one and as I was researching I've stumbled on a lot of code and did pieced them all together (I wish there were better documents though) but here's my part of the code. Address is a 1..1 relationship and Phones is a 1..n relationship to events.

  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 

(And sorry if I can't provide my links, they were kinda messed up)

like image 121
index Avatar answered Sep 24 '22 01:09

index


Here is a solution that allows you to dynamically define the number of embedded objects:

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 

This allows you to call FactoryGirl.create(:profile_with_notes) and get two embedded notes, or call FactoryGirl.create(:profile_with_notes, notes_count: 5) and get five embedded notes.

like image 33
emkman Avatar answered Sep 25 '22 01:09

emkman