1

任何人都可以提出一個更好的方法來使工廠使用預建模型 實例爲其關聯?例如,以便下面將有可能使用 來定義消息工廠的子項,以致可致電 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 

回答

2

我不知道如果這是你在找什麼,但如果你第一次創建你的消息可以通過該方式獲取發件人並將其分配給@me

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

這有幫助嗎?

+0

我沒有想到這一點,謝謝。我可以把它看作是其他情況的一個很好的簡寫,但是例如。這裏我們使用了Clearance寶石。 @me傾向於早期建立並重用於一堆對象,所以'@my_message = Factory(:message,:sender => @ me)'表格會更短更清晰。 – 2009-08-15 17:39:51

+0

問題是,是什麼讓當前用戶與其他用戶有所不同?它只是被分配給@me變量的事實嗎?這超出了工廠的範圍,並會引入不明確的依賴關係。 – ryanb 2009-08-15 20:27:22

+1

你是對的。經過反思,在工廠硬編碼@me(或類似)是愚蠢的。工廠需要一個參數,它通常以'Factory(:message,:sender => @ me)'形式作爲尾隨散列。 這似乎將它帶回到抽象出像'create_message_owned_by(@me)'這樣的幫助程序來包裝特定的重複關聯設置。 – 2009-08-15 23:34:49

1

忽略創建不明依賴的問題,上面的例子可以使用FactoryGirl 1.2.3中的新回調來處理。現在有after_buildafter_create回調,因此您可以在已創建的對象已經存在於數據庫中(並且擁有一個可以抓取的ID等)後對其執行操作。

另請參閱factory_girl郵件列表中的this questionthis thread