工場に組み立て済みのモデル インスタンスを関連付けるためのより良い方法を提案する人はいますか?たとえば、 は、 Factory(:my_message)
への呼び出しが Factory(:message,:sender=>@me)
の代わりに使用できるように、メッセージファクトリの子を定義することができます。factory_girlのアソシエーションを使用したDRYerテスト
設定したハッシュは、このような問題を引き起こす場合があります。 の例よりも複雑な場合があります。また、多くのテストで繰り返し設定されているため、工場にプッシュするほうがよいでしょう。
私は、テストヘルパーメソッド (create_message_owned_by(@me)
など)を定義することが考えられますが、factory_girl自体には方法があると思います。
factory_girl工場:
Factory.define :sender do |s|
sender.name "Dummy name"
end
Factory.define :message do |msg|
msg.text "Dummy text"
msg.association :sender
end
Factory.define :my_message, :parent=>:message do |msg|
msg.text "Dummy text"
### ? what goes here for msg.association :sender ? ###
end
MessagesControllerTest抜粋(使用shoulda):
context "on GET /messages" do
setup do
@me = Factory(:sender)
@my_message = Factory(:message,:sender=>@me)
@somebody_elses_message = Factory(:message)
sign_in_as(@me)
get :index
end
should "only assign my messages" do
assert_contains(assigns(:messages), @my_message)
assert_does_not_contain(assigns(:messages), @somebody_elses_message)
end
end
私はそれを考えなかった、ありがとう。私はそれを他の状況の素早い短縮形として見ることができます。ここではクリアランスの宝石を使用しています。 @meは早期に確立され、オブジェクトの束に再利用される傾向がありますので、 '@my_message = Factory(:message、:sender => @ me)'形式はもっと短く、より明確になります。 –
質問は、現在のユーザーと他のユーザーとの違いは何ですか? @me変数に代入されているだけですか?これは工場の範囲外であり、不明確な依存関係を導入することになります。 – ryanb
あなたは正しいです。リフレクションでは、@me(またはそれに類するもの)を工場にハードコーディングするのはダムです。ファクトリはパラメータを取る必要がありますが、これはもちろんFactory(:message、:sender => @ me)という形式の末尾のハッシュとしても非常に一般的です。 これは、 'create_message_owned_by(@me)'のようなヘルパーを抽象化して、特定の繰り返しアソシエーション設定をラップするように戻っているようです。 –