質問

工場に構築済みのモデルを使用させるためのより良い方法を提案できる人はいますか? その関連付けのインスタンス?たとえば、 を Message ファクトリの子として定義し、 Factory(:my_message) の代わりになるかもしれないFactory(:message,:sender=>@me) ?

セットアップハッシュは、この不自然なものよりも複雑である場合があります たとえば、ORは非常に多くのテストで繰り返されるため、工場に押し下げる方が良いようです。

私が考えることができる1つの代替案は、テストヘルパーメソッドを定義することです とか create_message_owned_by(@me), 、しかし、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)
@me = @my_message.sender

それは少しでも役に立ちますか?

他のヒント

不明瞭な依存関係を作成するという問題をしばらく無視すると、上記の例は FactoryGirl 1.2.3 の新しいコールバックで処理できます。今はあります after_build そして after_create コールバックを使用すると、作成されたオブジェクトがデータベースにすでに存在した後 (取得する ID などを取得した後)、そのオブジェクトに対して操作を実行できます。

こちらも参照 この質問 そして このスレッド Factory_girl メーリング リストから。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top