FactoryGirl definieren Attribut durch den Aufruf der Methode auf ein anderes Werk

Hier ist ein Beispiel aus der FactoryGirl Dokumentation:

FactoryGirl.define do
  factory :post do
    name "Post name"
    user
  end
end

In diesem Beispiel user Berufung auf eine andere Fabrik. Was ich tun möchte, ist effektiv nennen user.id, aber, um es als die definition eines Attributs. Hier ist eine abgespeckte Beispiel:

**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

Ich habe versucht zu integrieren, die Teil der Dokumentation, die beschreibt, Aliase, aber mit kein Glück:

FactoryGirl.define do
  factory :user, :aliases => [:assignee] do
  ....

Ich das Gefühl (die Hoffnung?) Ich bin hier in der Nähe, aber jede Einsicht wird sehr geschätzt. Danke.

EDIT: Dieser code ruft meine specs läuft!!!

**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

Und es geht meiner it { should be_valid } spec, so scheint es, dass die Fabrik ist zwar in Ordnung, aber ich glaube, ich habe einige refactoring in der spec selbst, wenn ich rufe FactoryGirl.create.

Den obigen code enthält die Vorschläge von mguymon. Danke!

LETZTEN UPDATE

Nach gehen zurück und re-Lektüre Hartl Diskussion über Modell Verbände, ich war in der Lage, diese Frage zu rest. Was ich oben war techincally gültig, aber nicht tatsächlich übergeben, werden die Attribute richtig, wenn ich gebaut oder neu geschaffenen Arbeitsplätze in meine Skillung. Hier ist, was ich hatte:

FactoryGirl.define do
  factory :job do
    association :assignee, factory: :user
    user
  end
end

Mein problem auch stammten aus wie ich, war die Schaffung von Fabriken in meine Skillung, so ist hier, wie ich getan haben sollte (aber nicht war... * seufz*):

    let(:user) { create(:user) }
    before { @job = create(:job, user: @user) }

Es scheint, dass ich nicht explizit haben association :user in meine Fabrik, noch brauche ich die before block von oben.

Als ein beiseite, ich habe auch gelernt, dass ich Debuggen kann durch die Einbeziehung puts @job innerhalb einer expect - Anweisung, oder rufen Sie @job.assignee_id um sicherzustellen, dass die Attribute sind ordnungsgemäß geladen. Wenn das bestimmten Spezifikationen ausgeführt wird, die puts - Anweisung wird die Ausgabe direkt durch die F oder . aus dem spec.

  • sorry, aber kann man den Ausnahme-stack-trace? Dank
Schreibe einen Kommentar