2011-09-01 67 views
4

通過railscast的情節啓發(http://railscasts.com/episodes/275-how-i-test)我想有一定的要求規格添加到我的應用程序。測試電子郵件與水豚和delayed_job的

使用delayed_job的發送我的電子郵件,我沒有找到一個簡單的方法來測試我的水豚測試中發送電子郵件,。我嘗試過:

it "emails user when requesting password reset" do 
     ...(some user action that triggers sending an email)... 
     Delayed::Worker.new.work_off 
     ActionMailer::Base.deliveries.last.to.should include(user.email) 
    end 

感謝您的任何提示或幫助!

回答

3

好吧,它應該工作。我在我的應用程序中發現了一些錯誤配置。

檢查你測試ENV。你應該設置:

Staffomatic::Application.configure do 
    ... 
    config.action_mailer.delivery_method = :test 
    config.action_mailer.default_url_options = { :host => "example.com" } 
end 

我加入了郵件的宏模塊中的線從railscast工作開關延遲::工作:

module MailerMacros 
    def last_email 
    Delayed::Worker.new.work_off 
    ActionMailer::Base.deliveries.last 
    end 

    def reset_email 
    Delayed::Job.destroy_all 
    ActionMailer::Base.deliveries = [] 
    end 
end 

現在你可以檢查:

last_email.to.should include(user.email) 

您的最後一封電子郵件。

很容易!

ps。如果你安裝了很棒的mail_safe gem,你應該確保它不在測試環境中。

8

容易得多的解決方案:只要創建在配置/初始化器,例如一個初始化delayed_job_config.rb

Delayed::Worker.delay_jobs = !Rails.env.test? 

在您的實際測試,你甚至不需要知道delayed_job的部署發送郵件,這使他們乾淨和簡單。