使用capybara和delayed_job测试电子邮件

时间:2011-09-01 13:07:10

标签: ruby-on-rails-3 testing capybara

受到railscast(http://railscasts.com/episodes/275-how-i-test)一集的启发,我试图在我的应用中添加一些请求规范。

使用delayed_job发送我的电子邮件,我没有找到一种简单的方法来测试我的capybara测试中的电子邮件发送。我试过了:

    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

感谢任何提示或帮助!

2 个答案:

答案 0 :(得分:8)

更简单的解决方案:只需在配置/初始化程序中创建初始化程序,例如delayed_job_config.rb

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

在您的实际测试中,您甚至不需要知道已经部署了delayed_job来发送邮件,这使它们保持干净和简单。

答案 1 :(得分:3)

好吧,它应该工作。我在我的应用程序中发现了一些错误配置。

检查你的测试环境。你应该设置:

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

我在railscast的邮件程序宏模块中添加了一行来处理Delayed :: Job:

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,您应该确保它不在测试环境中。