2010-02-10 5 views
19

Sto utilizzando il plug-in factory_girl nell'applicazione rails. Per ogni modello, ho un file rubino corrispondente contenente i dati di fabbrica, ad es.Accesso alle factory factory_girl in * altri * factory

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

Ho molti tipi diversi di utenti (già definiti nella fabbrica utente). Se provo quanto segue però:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

ottengo il seguente errore:

# No such factory: valid_user (ArgumentError) 

L': valid_user è in realtà valida anche se - posso usarlo nel mio test - non solo nelle mie fabbriche. C'è un modo in cui posso usare una fabbrica definita in un altro file qui?

risposta

4

provare a utilizzare il metodo di un'associazione come:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 
+0

Si può anche fare 't.associazione: utente, fabbrica:: valid_user' – Kris

29

Dovreste usare questo codice:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

Avvolgere la chiamata in {} provoca Factory Girl di non valutare il codice all'interno delle parentesi graffe fino il: factory valid_thing è stato creato. Questo lo costringerà ad aspettare fino a quando: factory valid_user è stato caricato (il tuo esempio fallisce perché non è ancora caricato), causerà anche un nuovo: valid_user da creare per ogni: valid_thing piuttosto che avere lo stesso utente per tutti : valid_thing's (che è probabilmente quello che vuoi).

+10

Questo funziona bene. Sappi solo che la sintassi 'Factory (: valid_user)' è stata deprecata; usa 'FactoryGirl.create (: valid_user)'. –

+0

Usare 'create (: valid_user)' quando provo a creare (: valid_thing) creerò una creazione, giusto? C'è un modo per rendere questo riferimento generico da creare/creare a seconda di ciò che viene chiamato? – mpgarate

+0

@mpgarate - No, build no –

3

Potenzialmente una nuova funzione di Factory Girl a giudicare dall'età della domanda, ma se il nome del tuo attributo in fabbrica è lo stesso del nome della fabbrica, semplicemente chiamando il nome dell'attributo nella tua fabbrica sarà popolarlo con la generazione di Fabbrica associata.

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

Ciò dovrebbe comportare il campo utente alla ricerca di una factory con lo stesso nome e di popolamento da quella.

+0

Questo ha funzionato per me –