2015-03-02 45 views
0

我有兩個控制器創建一個用戶,創建時,我想給他們發一封電子郵件。由於DRY,我將電子郵件邏輯移至on_create回調。但是,現在,每當我在rspec測試中創建一個用戶(例如使用factorygirl)時,它都會發送一封電子郵件。Rails:只測試一次on_create回調

一些可能的想法我有:

  • 我可以模擬出這種行爲,但後來我需要模擬這一切的時候...
  • 我可以使它的參數(例如一個布爾值,只有當電子郵件應該被髮送時纔是真的),但是我只會添加這個測試

這樣做的最乾淨的方法是什麼?

+1

最簡潔的方法可能是*不使用模型回調,而是將用戶創建封裝在單獨的類/模塊/方法中。在那裏,你可以明確地生成電子郵件(然後你不會在你的測試中做) – 2015-03-02 13:06:15

回答

0

最好的做法是從控制器上下文中調用電子郵件的發送,而不是模型。從框架的角度來看,郵件程序與控制器在視圖鏈接和控制操作流程方面非常相似。

我會將回調邏輯移回每個控制器。你是正確的,它不是嚴格的DRY但在我看來這種情況下它是最可讀和明確的方法,值得交易。

在你控制器測試,您可以檢查郵件交付:

before(:each) { ActionMailer::Base.deliveries = [] } 
it "does a thing" do 
    subject 
    expect(ActionMailer::Base.deliveries.count).to eq 1 
end 

這種方法是面向未來的,你應該要做出改變來區分這兩個電子郵件和誰拿起任何開發人員代碼不會沿着盲目的衚衕走下去,而迷離的電子郵件從模型中隱藏起來。