Ecco un esempio dalla factorygirl documentation:factorygirl definiscono attributo con il metodo invitando un altro stabilimento
FactoryGirl.define do
factory :post do
name "Post name"
user
end
end
In questo esempio, user
invoca un altro stabilimento. Quello che vorrei fare è effettivamente chiamare user.id
, ma impostarlo come la definizione di un attributo. Ecco un esempio ridotto all'osso:
**models/job.rb**
...
belongs_to :assignee, :class_name => "User"
belongs_to :user
...
attr_accessible :assignee_id, :user_id
...
end
**factories/jobs.rb**
FactoryGirl.define do
factory :job do
assignee_id user.id #what I would like to do, but triggers "undefined method 'id'" error
user_id user.id #user_id is an attribute of the model and is the job assignor
end
Ho cercato di incorporare la parte della documentazione che discute gli alias, ma senza fortuna:
FactoryGirl.define do
factory :user, :aliases => [:assignee] do
....
Mi sento come se'(speranza?) m chiudi qui, ma qualsiasi intuizione è apprezzata. Grazie.
MODIFICA: questo codice ottiene le mie specifiche in esecuzione!
**factories/jobs.rb**
FactoryGirl.define do
factory :job do
before(:create) do |job|
user = FactoryGirl.create(:user)
job.assignee = user
job.user = user
end
association :assignee, factory: :user
association :user, factory: :user
sequence(:user_id) { |n| n }
sequence(:assignee_id) { |n| n }
...
end
e passa il mio it { should be_valid }
spec, così sembra che la fabbrica va bene, anche se penso di avere un po 'di refactoring nelle specifiche stesso quando sto chiamando FactoryGirl.create
.
Il codice sopra incorpora i suggerimenti di mguymon. Grazie!
aggiornamento finale
Dopo andando avanti e rileggendo Hartl's discussion on model associations, sono stato in grado di mettere questa materia per riposare. Quello che ho sopra era tecnicamente valido, ma in realtà non ha trasmesso correttamente gli attributi quando ho creato o creato lavori nelle mie specifiche. Ecco cosa mi avrebbe dovuto avere:
FactoryGirl.define do
factory :job do
association :assignee, factory: :user
user
end
end
Il mio problema derivava anche da come stavo creando fabbriche nella mia spec, quindi ecco come avrei fatto (ma non era ... sigh):
let(:user) { create(:user) }
before { @job = create(:job, user: @user) }
Sembra che io non abbia esplicitamente il association :user
nella mia fabbrica, né ho bisogno del blocco before
dall'alto.
Per inciso, ho anche imparato che posso mettere a punto includendo puts @job
all'interno di un expect
dichiarazione, oppure chiamare @job.assignee_id
per assicurarsi che gli attributi vengono caricati correttamente. Quando viene eseguita questa particolare specifica, l'istruzione puts
verrà emessa direttamente dallo F
o dallo .
dalla specifica.
scusate, ma potete visualizzare la traccia dello stack di eccezioni? grazie – ted