任何人都可以提出一個更好的方法來使工廠使用預建模型 實例爲其關聯?例如,以便下面將有可能使用 來定義消息工廠的子項,以致可致電 Factory(:my_message)
可替代 Factory(:message,:sender=>@me)
?DRYER測試與在factory_girl協會
有時候安裝哈希比在這個人爲的 的例子中涉及更多,或者只是在很多測試中重複使用,以至於將它推入工廠似乎更好。
我能想到的另一種方法是定義一個測試幫助方法 ,如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摘錄(使用早該):
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
我沒有想到這一點,謝謝。我可以把它看作是其他情況的一個很好的簡寫,但是例如。這裏我們使用了Clearance寶石。 @me傾向於早期建立並重用於一堆對象,所以'@my_message = Factory(:message,:sender => @ me)'表格會更短更清晰。 – 2009-08-15 17:39:51
問題是,是什麼讓當前用戶與其他用戶有所不同?它只是被分配給@me變量的事實嗎?這超出了工廠的範圍,並會引入不明確的依賴關係。 – ryanb 2009-08-15 20:27:22
你是對的。經過反思,在工廠硬編碼@me(或類似)是愚蠢的。工廠需要一個參數,它通常以'Factory(:message,:sender => @ me)'形式作爲尾隨散列。 這似乎將它帶回到抽象出像'create_message_owned_by(@me)'這樣的幫助程序來包裝特定的重複關聯設置。 – 2009-08-15 23:34:49