上のメソッドを呼び出すことで、属性を定義するにはFactoryGirl documentationからの例です。この例では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の提案が組み込まれています。ありがとう!
FINAL UPDATE
帰るとHartl's discussion on model associations再読んだ後、私は休むためにこの問題を置くことができました。私が上記のことはtechincally有効だったが、実際に私の仕様でジョブを構築または作成したときに属性を正しく渡さなかった。ここで私が持っていたはずですものだ:
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
ブロックが必要ではありません。
はさておき、私はまた、私はexpect
ステートメント内puts @job
を含めることによって、デバッグ、または属性が正しくロードされていることを確認するために@job.assignee_id
を呼び出すことができることを学びました。その特定の仕様が実行されると、puts
ステートメントはF
または.
によって仕様から正しく出力されます。 FactoryGirlの最新版について
申し訳ありませんが、例外スタックトレースを表示できますか?ありがとうございました – ted