2012-12-30 10 views
12

Ich habe ein Account-Modell, das gehört zu einem Vorbild.Fabrik Mädchen verschachtelte Fabrik

Die erste Fabrik erstellt eine Rolle namens "Student". Die zweite Factory erstellt ein Konto, das der Studentenrolle zugeordnet ist, die in der vorherigen Factory erstellt wurde. Es ist auch mit einem Benutzer verbunden ... was für diese Frage nicht wichtig ist.

Ich habe viele Rollen zu testen (Admin, Student, Assistent) ... Ich möchte nicht 'Student' in der Rolle Fabrik angeben ... das ist zu statisch. Wie lege ich fest, welche Rolle zum Zeitpunkt der Erstellung der Account Factory erstellt werden soll? Wie:

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

Was ist der beste Weg, dies zu erreichen?

Antwort

27

Wenn Sie eine rein FG Lösung wollen, könnten Sie Traits verwenden:

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 

Sie können jedoch die Eigenschaften der Fabrik außer Kraft setzen, wenn Sie das Factory-Objekt erstellen. Dies ermöglicht mehr Flexibilität:

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

Da dies offensichtlich ausführlich ist, ich ein kleines Hilfsmethode erstellen würde:

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

Dann in Ihren Tests:

let(:account) { account_as "student" } 

Alternativ Sie könnte nur Ihren Rollengenerator verkürzen, so dass Sie ihn wie folgt verwenden könnten:

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

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

Ihre Erklärung war super! Danke für die schnelle Hilfe! Das sieht genau so aus, wie ich es brauche ... – hellion

+0

Wo soll ich die Hilfsdatei ablegen? Nur im Testverzeichnis? – hellion

+0

Wenn du rspec verwendest, gehen diese normalerweise in 'spec/support /'. Oder du kannst es einfach direkt in dein 'spec_helper.rb' schreiben –