6

Ho una fabbrica factorygirl, che crea un Order ma la prima (: creare) callback non crea l'oggetto factory associato:factorygirl prima (: creare) non richiamata la creazione di associazioni

classe genitore

class Order < ActiveRecord::Base 
    attr_accessible :tax, :total 
    has_many :order_lines 

    validates :user, presence: true 
    validates :order_lines , presence: true 
end 

Bambino Classe

class OrderLine < ActiveRecord::Base 
    attr_accessible :order, :product, :qty 
    belongs_to :order 
    belongs_to :product 
    ... 
    ... 
    validates :order, presence: true 
end 

fabbrica

Factory :order do 
    ... 
    ignore do 
    number_or_order_lines 1 
    end 
    before(:create) do |order, evaluator| 
    FactoryGirl.create_list :order_line, evaluator.number_or_order_lines, order: order 
    end 
end 

Factory :order_line do 
    association :user 
    association :order 
    ... 
end 

PROBLEMA

Nella mia prova RSpec, se creo un oggetto ordine:

describe Order do 
    before {@order = FactoryGirl.create(:order) } => #throws error (see below) 
end 

ERRORE ActiveRecord :: RecordInvalid Validazione fallita Ordine linee possono essere vuoto

UPDATE

Posso tuttavia con successo effettuare le seguenti operazioni, ma ovviamente solo compie la creazione di uno:

after(:build) do |order, evaluator| 
    order.order_lines << FactoryGirl.build(:order_line, order: order) 
end 

Ipotesi - posso vedere dove la create_list potrebbe essere il tentativo di salvare il OrderLine che causerebbe un errore dal momento che il genitore non è stato salvato - ma non so se restituisce ancora un oggetto OrderLine che si trova solo in uno stato non valido e quindi la raccolta order_lines nell'oggetto ordine non dovrebbe essere ancora vuota.

+4

Provare a utilizzare dopo (: build) al posto di prima (: creare) –

+0

Aggiornamento del problema con le nuove informazioni - Ho provato il dopo (: build) oltre a utilizzare build_list anziché create_list. Sfortunatamente, l'unico modo in cui funzionerà se la validazione per order_lines sul modello Order. – pghtech

+0

Sto affrontando lo stesso numero –

risposta

6

è necessario mettere la vostra fabbrica OrderLine nel record ordine come questo

Factory :order do 
    ... 
    ignore do 
     number_or_order_lines 1 
    end 
    before(:create) do |order, evaluator| 
     order.order_lines << (FactoryGirl.create :order_line, order: order) 
    end 
    end 
+1

Grazie a questo mi ha aiutato :) –