1

任何人都可以提出一种更好的方法来让工厂使用预先构建的模型实例进行关联吗?例如,这样就可以在下面定义消息工厂的子级,以便调用 to Factory(:my_message)可以代替 Factory(:message,:sender=>@me)?

有时设置散列比这个人为的例子更复杂,或者只是在很多测试中重复,看起来最好把它推到工厂里。

我能想到的一种替代方法是定义一个测试辅助方法,例如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
4

2 回答 2

2

我不知道这是否是您要查找的内容,但是如果您首先创建消息,则可以通过该消息获取发件人并将其分配给@me.

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

这些帮助有用?

于 2009-08-14T15:27:14.370 回答
1

暂时忽略创建不明确依赖项的问题,上面的示例可以使用 FactoryGirl 1.2.3 中的新回调来处理。现在有回调after_buildafter_create回调,这样您就可以在创建的对象已经存在于数据库中之后对它们执行操作(并且有一个可以抓取的 id 等)。

另请参阅factory_girl 邮件列表中的这个问题这个线程

于 2009-10-27T18:13:36.100 回答