有没有办法在测试电子邮件时阻止Rails自动清除类变量?

时间:2016-05-05 08:23:05

标签: ruby-on-rails email

我测试了在某些情况下发送电子邮件的Rails应用程序。这是一个API。

对于测试,我使用Airborne宝石,这使得API测试非常简单。一切都正确,除非我必须测试电子邮件发送。我尝试了以下方法:

it "blah" do
  //Code that makes my API send an email
  puts ActionMailer::Base.deliveries.inspect
end

但是deliveries数组总是空的。我也试过Emails.deliveries.inspect。电子邮件是我的自定义邮件程序,它继承了ActionMailer::Base

我结束了阅读ActionMailer的API文档并遇到了拦截器概念。拦截器无法使用:test投放方式,因此我切换到:smtp。实际上,电子邮件正在正确发送,但我无法在测试中访问它们以达到期望。

我的拦截器代码就是这个

initializers/email_interceptor.rb

class EmailInterceptor

  @@msgs = []    

  def self.delivering_email(message)
    puts message
    //Rails.logger.debug "Email being sent: " + message.to_s
    @@msgs << message
    Rails.logger.debug "Actual messages array: #{@@msgs}"
  end

  def self.msgs
    @@msgs
  end
end

ActionMailer::Base.register_interceptor(EmailInterceptor)

一切都好。调试消息打印正确填充的阵列。但是在执行测试语句之前清除变量。 编辑:上面的代码是在我运行我的测试套件时执行的。但是从测试本身访问变量是空的。

//test code
puts EmailInterceptor.msgs.inspect
=> []

有什么方法可以阻止这种行为吗?

1 个答案:

答案 0 :(得分:0)

您的test.rb配置中可能有include_recipe。您似乎应该使用config.action_mailer.perform_deliveries = false,因为这样可以填充config.action_mailer.delivery_method = :test,这样可以更轻松,更可靠地进行测试。你真的需要拦截器进行测试吗?