2014-06-20 6 views
7

beiseite beiseite Argumente, ob Sie die Existenz der Assoziationen eines Modells testen sollten, habe ich ein Modell Order genannt und ich bestätige, dass es mindestens eine item in hat sein has_many Verein mit:Validierung, dass eine has_many Assoziation hat mindestens ein Modell bei der Verwendung von FactoryGirl

class Order < ActiveRecord::Base 

    has_many :items 

    validates :items, presence: true 

end 

I factory gesetzt habe meine Fabriken Fussel (auf Gültigkeit überprüft). Daher ist meine Auftragsfactory ungültig, es sei denn, ich erstelle einen Artikel für die has_many Kollektion.

Meine orders Fabrik sieht wie folgt aus:

FactoryGirl.define do 

    factory :order do 

    ignore do 
     items_count 1 
    end 

    after(:build) do |order, evaluator| 
     create_list(:item, evaluator.items_count, order: order) 
    end 

    end 
end 

Nach Factory Girl des Getting Started:

FactoryGirl.lint builds each factory and subsequently calls #valid? on it 

Allerdings, wenn ich meine specs laufen, wirft Factory Girl eine FactoryGirl::InvalidFactoryError weil die Auftragsfabrik ist ungültig.

Umgehung

after(:build) do |order, evaluator| 
    evaluator.items_count.times do 
    order.items << FactoryGirl.create(:item) 
    end 
    #create_list(:item, evaluator.items_count, order: order) 
end 
+0

Sie machen einen 'create_list (: Artikel)', haben Sie 'item' Fabrik definiert? – vee

+0

Ja. Die Artikelfabrik ist da und ist gültig. – Undistraction

+0

Ich denke, du solltest 'after (: create)' anstelle von 'after (: build)' dafür verwenden, denn mit nur build wird 'order' nicht gespeichert und es gibt keine' order_id' für 'items'. – vee

Antwort

0

Nach der Definition wird es .valid? nach dem Bau nennen. Es scheint, dass es dies vor dem Ausführen des Blocks after(:build) aufrufen wird.

Versuchen Sie Werk wie dieses schreiben:

FactoryGirl.define do 

    factory :order do 

    ignore do 
     items_count 1 
    end 

    items { build_list(:item, items_count) } 

    end 
end 

Dies sollte das Element bauen, bevor die .valid? genannt wird.

Lassen Sie mich wissen, ob das funktioniert :)