繁体   English   中英

DRYer测试与factory_girl中的关联

[英]DRYer tests with associations in factory_girl

谁能建议一种更好的方法来使工厂将预构建的模型实例用于其关联? 例如,在下面可以定义Message工厂的子级,以便对Factory(:my_message)的调用可以代替Factory(:message,:sender=>@me)

有时,设置散列比这个人为的示例所涉及的更多,或者只是在如此多的测试中重复进行,以至于将其推入工厂似乎更好。

我可以想到的另一种方法是定义一个测试助手方法,例如create_message_owned_by(@me) ,但是我希望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_buildafter_create回调,因此您可以在已创建的对象已经存在于数据库中之后对其执行操作(并具有要抓住的ID等)。

另请参见factory_girl邮件列表中的此问题该主题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM