1

工場に組み立て済みのモデル インスタンスを関連付けるためのより良い方法を提案する人はいますか?たとえば、 は、 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 

答えて

2

これはあなたが探しているものであれば、私は知りませんが、あなたが最初にあなたのメッセージを作成する場合それを介して送信者を取得し、@meに割り当てることができます。

@my_message = Factory(:message) 
@me = @my_message.sender 

それはまったく役に立ちますか?

+0

私はそれを考えなかった、ありがとう。私はそれを他の状況の素早い短縮形として見ることができます。ここではクリアランスの宝石を使用しています。 @meは早期に確立され、オブジェクトの束に再利用される傾向がありますので、 '@my_message = Factory(:message、:sender => @ me)'形式はもっと短く、より明確になります。 –

+0

質問は、現在のユーザーと他のユーザーとの違いは何ですか? @me変数に代入されているだけですか?これは工場の範囲外であり、不明確な依存関係を導入することになります。 – ryanb

+1

あなたは正しいです。リフレクションでは、@me(またはそれに類するもの)を工場にハードコーディングするのはダムです。ファクトリはパラメータを取る必要がありますが、これはもちろんFactory(:message、:sender => @ me)という形式の末尾のハッシュとしても非常に一般的です。 これは、 'create_message_owned_by(@me)'のようなヘルパーを抽象化して、特定の繰り返しアソシエーション設定をラップするように戻っているようです。 –

1

不明な依存関係を作成するという問題を無視して、上記の例をFactoryGirl 1.2.3の新しいコールバックで処理できます。現在after_buildafter_createのコールバックがあるので、作成されたオブジェクトがすでにデータベースに存在していて(そして、などを取得するIDを持っている)操作を実行できます。

factory_girlメーリングリストのthis questionおよびthis threadも参照してください。

関連する問題