2013-07-10 3 views
22

Per impostazione predefinita, factorygirl chiama le fabbriche di associazioni per la loro creazione. Posso passare un'associazione per una fabbrica come parametro. Ma come posso passare un oggetto che dovrebbe essere usato in profondità nella catena delle associazioni?come passare parametri attraverso la catena di associazioni in factorygirl

Ad esempio:

Ho un messaggio, che ha un PostsManager, che ha un account, che appartiene alla CURRENT_USER.

Quando faccio un Factory(:post) crea un PostsManager, che crea un Account, che non appartiene all 'utente corrente (stub).

Così, in specifiche che utilizzano la fabbrica messaggio che devo fare:

account = Factory(:account, user: current_user) 
post_manager = Factory(:post_manager, account: account) 
post = Factory(:post, post_manager: post_manager) 

Quello che vorrei fare è chiamare la fabbrica con Factory(:post, user: current_user) e quindi passare current_user tutto il percorso attraverso le associazioni al Fabbrica di conto C'è un modo per farlo?

+0

Aggiungere esempio di codice. –

+0

Leggi http://sscce.org per favore. Senza ulteriori informazioni non siamo in grado di darti risposte accurate. –

+0

Sta chiedendo se gli attributi possono essere tramandate attraverso le associazioni se non esistono sui modelli originali. Questo può essere fatto con attributi transitori. Ho una risposta se riaprirai la domanda. –

risposta

21

Non sai quale versione di FactoryGirl stai usando, ma se sei su una versione recente (2.6+) puoi usare Transient Attributes (leggi di più sul loro "Getting Started" page). Si potrebbe fare qualcosa del genere:

FactoryGirl.define do 

    factory :post do 
    ignore do 
     user nil 
    end 
    posts_manager { FactoryGirl.build(:posts_manager, :user => user) } 
    end 

    factory :posts_manager do 
    ignore do 
     user nil 
    end 
    account { FactoryGirl.build(:account, :user => user) } 
    end 

    factory :account do 
    user { user } 
    end 

end 

FactoryGirl.create(:post, :user => current_user) 
+1

Vorrei aver trovato questo 2 anni fa. – stringsn88keys

+3

Per le versioni recenti di factorygirl, utilizzare 'transient' invece di' ignore' –