2014-06-20 10 views
7

Odkładając na bok argumenty dotyczące tego, czy należy testować istnienie asocjacji modelu, mam model o nazwie Order i potwierdzam, że ma on co najmniej jeden item w jego has_many stowarzyszenie przy użyciu:Sprawdzanie, czy stowarzyszenie ma wiele ma co najmniej jeden model przy użyciu FactoryGirl

class Order < ActiveRecord::Base 

    has_many :items 

    validates :items, presence: true 

end 

mam ustawiony FactoryGirl na sobie włókna swoje fabryki (sprawdzanie ważności). Tak więc moja fabryka zamówień jest nieważna, chyba że utworzę element dla jego kolekcji has_many.

Moja orders fabryka wygląda następująco:

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 

Według Dziewczyna z fabryki na Rozpoczęcie:

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

Jednak gdy uruchamiam moje specyfikacje, Dziewczyna z fabryki zgłasza FactoryGirl::InvalidFactoryError ponieważ fabrykę zamówienie jest nieważny.

Obejście

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

Robisz 'create_list (: pozycja)', masz 'item' fabrycznie zdefiniowane? – vee

+0

Tak. Fabryka przedmiotu jest tam i jest ważna. – Undistraction

+0

Myślę, że powinieneś używać 'after (: create)' zamiast 'after (: build)', ponieważ przy samej kompilacji 'order' nie jest zapisywany i nie ma' order_id' dla 'items'. – vee

Odpowiedz

0

Zgodnie z definicją, to zadzwoń .valid? po zakończeniu budowy. Wygląda na to, że wywoła to przed uruchomieniem bloku after(:build).

Spróbuj napisać Ci fabryki tak:

FactoryGirl.define do 

    factory :order do 

    ignore do 
     items_count 1 
    end 

    items { build_list(:item, items_count) } 

    end 
end 

ta powinna budować pozycję przed .valid? nazywa.

Daj mi znać, jeśli to działa :)