2012-12-30 2 views
12

역할 모델에 속한 계정 모델이 있습니다.공장 소녀 중첩 공장

factory :role do 
    name "student" 
end 

factory :account do 
    user 
    role 
end 

첫 번째 팩토리는 "student"라는 역할을 만듭니다. 두 번째 팩토리는 이전 팩토리에서 작성된 학생 역할과 연관된 계정을 작성합니다. 그것은 또한이 질문에 중요하지 않은 사용자와 연관되어 있습니다.

테스트 할 많은 역할 (관리자, 학생, 조수) ... 역할 팩토리에서 '학생'을 지정하고 싶지 않습니다. 너무 정적입니다. 계정 팩토리가 생성 될 때 생성 할 역할을 어떻게 지정합니까? 유사 :

factory :account do 
    user 
    role_id { factory :role { name: "admin"} } 
    end 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 당신이 순수하게 FG 솔루션을 원하는 경우

답변

27

, 당신은 특성을 사용할 수 있습니다 : 당신이 공장 개체를 만들 때

factory :account do 
    user 

    trait :student do 
    association :role, :name => "student" 
    end 

    trait :admin do 
    association :role, :name => "admin" 
    end 
end 

FactoryGirl.create :account, :student 
FactoryGirl.create :account, :admin 

그러나 공장의 속성을 재정의 할 수 있습니다. 당신을

let(:account) { account_as "student" } 

다른 방법 : 당신의 시험에서 다음

def account_as(role, options = {}) 
    FactoryGirl.create(:account, 
    options.merge(:role => FactoryGirl.create(:role, :name => "student")) 
) 
end 

이 분명히 자세한 때문에

FactoryGirl.create(:account, 
    :role => FactoryGirl.create(:role, :name => "student") 
) 

, 나는 약간의 도우미 메서드를 만들 것입니다 : 이것은 더 많은 유연성을 허용 역할 생성기를 단축하여 다음과 같이 사용할 수 있습니다.

def role(role, options = {}) 
    FactoryGirl.create :role, options.merge(:name => role) 
end 

account = FactoryGirl.create :account, :role => role("student") 
+0

당신의 설명은 굉장했습니다! 빠른 도움에 감사드립니다! 그게 정확히 내가 필요로하는 것 같습니다 ... – hellion

+0

도우미 파일을 어디에 두어야합니까? 테스트 디렉토리에 있습니까? – hellion

+0

rspec을 사용한다면, 전통적으로'spec/support /'에 들어갑니다. 아니면 그냥 직접 당신의'spec_helper.rb'에 넣을 수 있습니다. –

관련 문제