2012-12-30 24 views
12

Ho un modello di account che appartiene a un modello di ruolo.factory factory nested

factory :role do 
    name "student" 
end 

factory :account do 
    user 
    role 
end 

Il primo stabilimento crea un ruolo denominato "studente". Il secondo factory crea un account associato al ruolo degli studenti creato nel factory precedente. Inoltre è associato a un utente ... che non è importante per questa domanda.

Ho molti ruoli da testare (amministratore, studente, assistente) ... Non voglio specificare "studente" nel ruolo di fabbrica ... questo è troppo statico. Come faccio a specificare quale ruolo creare al momento della creazione della fabbrica dell'account? Come:

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

Qual è il modo migliore per realizzare questo?

risposta

27

Se si desidera una soluzione puramente FG, è possibile utilizzare Tratti:

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 

Tuttavia, è possibile ignorare le proprietà della fabbrica quando si crea l'oggetto di fabbrica. Questo consente una maggiore flessibilità:

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

Dal momento che questo è, ovviamente, verboso, mi piacerebbe creare un po 'di metodo di supporto:

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

Poi nei test:

let(:account) { account_as "student" } 

In alternativa, è potrebbe semplicemente accorciare il tuo generatore di ruolo in modo da poterlo utilizzare come:

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

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

La tua spiegazione è stata FANTASTICA! Grazie per il rapido aiuto! Sembra esattamente quello di cui ho bisogno ... – hellion

+0

Dove devo inserire il file di supporto? Solo nella directory dei test? – hellion

+0

Se stai usando rspec, quelli tradizionalmente vanno in 'spec/support /'. O potresti metterlo direttamente nel tuo 'spec_helper.rb' –