2010-07-30 4 views
2

Email 모델과 many-to-many 관계를 가지고있는 Person 모델을 가지고 있고 그 사람의 이름과 성을 생성 할 수있는 팩토리를 만들고 싶습니다 (이미 완료되었습니다). 그리고 이메일 주소를 만듭니다. 그 사람의 이름을 기반으로합니다.factory_girl에서 many-to-many 연관을 어떻게 만들거나 만들 수 있습니까?

Factory.sequence :first_name do |n| 
    first_name = %w[FirstName1 FirstName2] # ... etc (I'm using a real subset of first names) 
    first_name[(rand * first_name.length)] 
end 

Factory.sequence :last_name do |n| 
    last_name = %w[LastName1 LastName2] # ... etc (I'm using a real subset of last names) 
    last_name[(rand * last_name.length)] 
end 

Factory.define :person do |p| 
    #p.id ??? 
    p.first_name { Factory.next(:first_name) } 
    p.last_name { Factory.next(:last_name) } 
    #ok here is where I'm stuck 
    #p.email_addresses {|p| Factory(:email_address_person_link) } 
end 

Factory.define :email_address_person_link do |eapl| 
    # how can I link this with :person and :email_address ? 
    # eapl.person_id ??? 
    # eapl.email_address_id ??? 
end 

Factory.define :email_address do |e| 
    #how can I pass p.first_name and p.last_name into here? 
    #e.id ??? 
    e.email first_name + "." + last_name + "@test.com" 
end 

답변

3

좋아, 지금 내가 묻고있는 것을 이해하고 있다고 생각합니다. 이 같은 뭔가 (테스트되지 않은,하지만 난 다른 프로젝트에서 비슷한 짓을했는지) 작동합니다 : 세 번째, 별도의 공장을 사용

언급 한 바와 같이
Factory.define :person do |f| 
    f.first_name 'John' 
    f.last_name 'Doe' 
end 

Factory.define :email do |f| 
end 

# This is optional for isolating association testing; if you want this 
# everywhere, add the +after_build+ block to the :person factory definition 
Factory.define :person_with_email, :parent => :person do |f| 
    f.after_build do |p| 
    p.emails << Factory(:email, :email => "#{p.first_name}.#{p.last_name}@gmail.com") 
    # OR 
    # Factory(:email, :person => p, :email => "#{p.first_name}.#{p.last_name}@gmail.com") 
    end 
end 

는 선택 사항입니다. 필자의 경우 모든 테스트마다 연결을 항상 생성하고 싶지 않았기 때문에 몇 가지 특정 테스트에만 사용했던 별도의 공장을 만들었습니다.

+0

그게 효과가있어! 관심있는 사람은 http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl 또는 http://railsondave.blogspot.com/2009/에서이 블로그를 확인해보십시오. 05/creating-hasmany-through-factories-with.html – DJTripleThreat

2

사용 콜백 (자세한 내용은 FG의 문서를 참조) 여기에 person의 이름을 작성을 위해 내가 가진 것입니다. 콜백은 현재 모델이 만들어 지도록 전달됩니다.

Factory.define :person do |p| 
    p.first_name { Factory.next(:first_name) } 
    p.last_name { Factory.next(:last_name) } 
    p.after_build { |m| p.email_addresses << "#{m.first_name}.#{m.last_name}@test.com" } 
end 

나는 그렇게 생각합니다.

실제 성과 이름과 전자 메일 주소를 만드는 Faker gem을 사용하여 몇 가지 작업을 살펴볼 수도 있습니다.

+0

나는 이것이 내가 정확히 찾고있는 것이라고 생각하지 않는다. 나는 명확성을 위해 나의 질문을 편집했다. +1하지만 faker gem. 이 작업을 수행하는 방법을 알고 싶습니다. factory_girl의 작동 방식을 더 잘 이해할 수 있습니다. – DJTripleThreat

관련 문제