簡體   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