DRYer在factory_girl中使用关联进行测试

时间:2009-08-14 01:47:28

标签: ruby-on-rails testing factory functional-testing factory-bot

任何人都可以提出一个更好的方法来让工厂使用预建模型 它的关联实例?例如,这样就可以了 下面定义一个Message工厂的子进程,以便调用 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

2 个答案:

答案 0 :(得分:2)

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

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

这有帮助吗?

答案 1 :(得分:1)

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

另请参阅factory_girl邮件列表中的this questionthis thread