我测试了在某些情况下发送电子邮件的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
=> []
有什么方法可以阻止这种行为吗?
答案 0 :(得分:0)
您的test.rb配置中可能有include_recipe
。您似乎应该使用config.action_mailer.perform_deliveries = false
,因为这样可以填充config.action_mailer.delivery_method = :test
,这样可以更轻松,更可靠地进行测试。你真的需要拦截器进行测试吗?