2013-07-10 6 views
22

Standardmäßig ruft FactoryGirl die Fabriken von Assoziationen auf, um sie zu erstellen. Ich kann eine Assoziation für eine Fabrik als Parameter übergeben. Aber wie kann ich ein Objekt passieren, das tief in der Assoziationskette verwendet werden soll?So übergeben Sie Parameter über die Assoziationskette in FactoryGirl

Zum Beispiel:

Ich habe einen Post, die eine PostsManager hat, der ein Konto hat, der den current_user gehört.

Wenn ich eine Factory(:post) mache, erstellt es einen PostsManager, der ein Konto erstellt, das nicht zum (stubed) current_user gehört.

in specs So, dass die Post Fabrik verwenden ich tun muss:

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

Was ich möchte, ist die Fabrik mit Factory(:post, user: current_user) tun, rufen und dann current_user passieren den ganzen Weg durch die Verbände der Rechnungsfabrik Gibt es eine Möglichkeit, dies zu tun?

+0

Möchten Sie Code Beispiel hinzufügen. –

+0

Lesen Sie bitte http://sscce.org. Ohne weitere Informationen können wir Ihnen keine genauen Antworten geben. –

+0

Er fragt, ob Attribute über Verknüpfungen weitergegeben werden können, wenn sie nicht in den ursprünglichen Modellen vorhanden sind. Dies kann mit transienten Attributen geschehen. Ich habe eine Antwort, wenn Sie die Frage erneut öffnen. –

Antwort

21

Nicht sicher, welche Version von FactoryGirl Sie verwenden, aber wenn Sie eine aktuelle Version (2.6+) haben, können Sie Transient Attribute verwenden (lesen Sie mehr unter "Getting Started" page). Sie könnten so etwas tun:

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

Ich wünschte, ich hätte das vor 2 Jahren gefunden. – stringsn88keys

+3

Verwenden Sie für neuere Versionen von FactoryGirl "transient" statt "ignore" –