2014-06-20 11 views
7

Mettendo da parte gli argomenti sull'esistenza o meno dell'esistenza delle associazioni di un modello, ho un modello chiamato Order e sto verificando che abbia almeno uno item in la sua associazione con has_many:Convalida che A has_many Association abbia almeno un modello quando si usa FactoryGirl

class Order < ActiveRecord::Base 

    has_many :items 

    validates :items, presence: true 

end 

ho impostato factorygirl a Lint miei fabbriche (verifica di validità). Quindi la mia fabbrica di ordini non è valida a meno che non crei un articolo per la sua collezione has_many.

mia fabbrica orders si presenta così:

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 

Secondo di Factory Girl Per iniziare:

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

Tuttavia quando ho eseguito le mie specifiche, Factory Girl lancia un FactoryGirl::InvalidFactoryError perché la fabbrica ordine è invalido.

Soluzione

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

stai facendo un 'create_list (: l'articolo)', hai 'definito item' fabbrica? – vee

+0

Sì. La fabbrica dell'articolo è lì ed è valida. – Undistraction

+0

Penso che dovresti usare 'after (: create)' invece di 'after (: build)' per questo perché con la semplice build l''ordine' non viene salvato e non c'è 'order_id' per' items'. – vee

risposta

0

Secondo la definizione, si chiamerà .valid? dopo la costruzione. Sembra che lo chiamerà prima di eseguire il blocco.

Prova tu a scrivere fabbrica in questo modo:

FactoryGirl.define do 

    factory :order do 

    ignore do 
     items_count 1 
    end 

    items { build_list(:item, items_count) } 

    end 
end 

Questo dovrebbe costruire l'oggetto prima della .valid? si chiama.

farmi sapere se questo funziona :)

Problemi correlati