ActionMailer在测试模式下发送真实的电子邮件! - 如何关闭?

时间:2012-06-09 14:52:57

标签: ruby-on-rails-3 actionmailer rspec-rails sendgrid

新用户注册我的小应用程序必须得到管理员(我)的批准才能访问该网站。我已经成功地在我的用户模型中使用after_create :send_admin_email开发了这样的电子邮件,效果很好。我的问题是我在测试期间(使用FactoryGirl)生成多个用户,并且每个创建的测试用户都会发送一封真实的电子邮件。运行我的测试就像在1月份浇糖蜜,我必须删除发送到我收件箱的数百封电子邮件。我怎么把它关掉?

Action Mailer Basics中的

Rails Guides告诉我“默认情况下,Action Mailer不会在测试环境中发送电子邮件。它们只是添加到ActionMailer :: Base.deliveries数组中。”

此外,在config/environments/test.rb我得到了:

config.action_mailer.delivery_method = :test

config/environment.rb之外还有:

# Configuration for using SendGrid on Heroku
ActionMailer::Base.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => '587',
  :authentication => :plain,
  :user_name      => 'app[my app number]@heroku.com',
  :password       => '[something super secret]',
  :domain         => '[let's get this party started!.com]',
  :enable_starttls_auto => true
}
ActionMailer::Base.delivery_method = :smtp

我确信我错过了简单和基本的东西。我已经搜索了相关问题和帖子处理如何测试ActionMailer实际发送电子邮件。

提前感谢任何想法或帮助。

附录:在回答Is it possible to turn off ActionMailer emails when cucumber testing is happening on development?发现的类似问题之后,我能够阻止电子邮件发送疯狂。不过,我不得不将ActionMailer::Base.delivery_method = :test添加到几个rspec文件中。有没有办法可以在全球范围内关闭它?有人对发生的事情有任何想法吗?

3 个答案:

答案 0 :(得分:36)

所以我已经明白了。在config / environment.rb中使用行ActionMailer::Base.delivery_method = :smtp会覆盖config / environments / test.rb中的ActionMailer::Base.delivery_method = :test

所以,删除该行,ActionMailer::Base.delivery_method = :smtp' 从config / environment.rb中,将其放在config / environments / production.rb中。 这允许您在config / environments / test.rb中放置ActionMailer::Base.delivery_method = :test以及在config / environments / development.rb中放置所需的版本。当我使用Faker填充数据库并将其更改为:test时,我创建了development.rb smtp,因此我确信真正的电子邮件是作为附加检查发送的。

注意:您必须重新启动服务器才能使这些更改生效。

另一个注意事项Heroku's current SendGrid Instructions将SendGrid Heroku配置代码放入新的config / initializers / mail.rb文件中,该文件可能需要删除其最后一行并在每个文件中放置所需的版本config / environments / [production.rb,development.rb,test.rb]

答案 1 :(得分:14)

也许有用......

我的config / environment.rb 包含ActionMailer::Base.delivery_method = :smtp而我的config / environments / test.rb 确实包含ActionMailer::Base.delivery_method = :test但Rails仍然在测试时发送邮件。

我只是将以下内容添加到config / environments / test.rb中进行修复:

config.action_mailer.perform_deliveries = false

答案 2 :(得分:0)

即使我 在config / environment.rb中写,我也遇到了类似Rails4.2(ActiveJob与ActionMailer的集成)的情况。

就我而言,这里的问题发生在使用“resque”作为后台工作者之后。最后,我发现以下配置为错误

配置/初始化/ active_job.rb:

Rails.application.config.active_job.queue_adapter = :resque   # here is WRONG

...因为它也影响了测试模式。

所以,我只在config / environments / {development,production.rb}中设置“queue_adapter =:resque”。现在,这正如我所料。