FactoryGirlドキュメントの例を次に示します。
FactoryGirl.define do
factory :post do
name "Post name"
user
end
end
この例でuser
は、別のファクトリを呼び出しています。私がやりたいことは、効果的に を呼び出すことですがuser.id
、それを属性の定義として設定することです。以下は簡略化された例です。
**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
エイリアスについて説明しているドキュメントの一部を取り入れようとしましたが、うまくいきませんでした:
FactoryGirl.define do
factory :user, :aliases => [:assignee] do
....
私は(希望?)私はここに近づいているように感じますが、洞察をいただければ幸いです。ありがとう。
編集: このコードは私の仕様を実行します!
**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
そして、それは私のit { should be_valid }
仕様に合格しているので、工場は問題ないようですが、私が呼び出すときに仕様自体にリファクタリングがあると思いますFactoryGirl.create
.
上記のコードには、mguymon からの提案が組み込まれています。ありがとう!
最終更新
Hartl のモデル アソシエーションに関する議論に戻って再読した後、私はこの問題を解決することができました。上記は技術的には有効でしたが、仕様でジョブをビルドまたは作成したときに、実際には属性を適切に渡しませんでした。これが私が持っていたはずのものです:
FactoryGirl.define do
factory :job do
association :assignee, factory: :user
user
end
end
私の問題は、仕様でファクトリを作成する方法にも起因していたので、次のようにする必要がありました (しかし、そうではありませんでした...ため息):
let(:user) { create(:user) }
before { @job = create(:job, user: @user) }
工場に明示的に持つ必要はないようですし、上からのブロックassociation :user
も必要ないようです。before
余談ですが、ステートメントputs @job
内に含めることでデバッグしたり、属性が適切にロードされていることを確認するために呼び出したりできることも学びました。その特定の仕様が実行されると、ステートメントは仕様のすぐそばまたは仕様から出力されます。expect
@job.assignee_id
puts
F
.