任何人都可以提出一种更好的方法来让工厂使用预先构建的模型实例进行关联吗?例如,这样就可以在下面定义消息工厂的子级,以便调用 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