2012-12-30 30 views
12

Mam model konta, który należy do modelu roli.Fabryka dziewczyna zagnieżdżona fabryka

factory :role do 
    name "student" 
end 

factory :account do 
    user 
    role 
end 

Pierwsza fabryka tworzy rolę o nazwie "student". Druga fabryka tworzy konto powiązane z rolą ucznia utworzoną w poprzedniej fabryce. Jest również powiązany z użytkownikiem ... co nie jest ważne dla tego pytania.

Mam wiele ról do przetestowania (admin, student, asystent) ... Nie chcę określać "studenta" w fabryce ról ... to jest zbyt statyczne. Jak określić, jaką rolę utworzyć w momencie tworzenia fabryki kont? Podobnych:

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

Jaki jest najlepszy sposób na osiągnięcie tego?

Odpowiedz

27

Jeśli chcesz czysto FG rozwiązanie, można użyć Cechy:

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 

Można jednak przesłonić właściwości fabryki podczas tworzenia obiektu fabrycznego. Pozwala to na większą elastyczność:

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

Ponieważ jest to oczywiście gadatliwy, którą tworzę trochę metody pomocnika:

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

Następnie w badaniach:

let(:account) { account_as "student" } 

Naprzemiennie cię może po prostu skrócić generator ról, dzięki czemu można go używać w następujący sposób:

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

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

Twoje wyjaśnienie było NIESAMOWITE! Dzięki za szybką pomoc! To wygląda dokładnie tak, jak potrzebuję ... – hellion

+0

Gdzie powinienem umieścić plik pomocnika? Tylko w katalogu testowym? – hellion

+0

Jeśli używasz rspec, te tradycyjnie przechodzą w 'spec/support /'. Lub możesz po prostu umieścić go bezpośrednio w 'spec_helper.rb' –

Powiązane problemy