新用户注册我的小应用程序必须得到管理员(我)的批准才能访问该网站。我已经成功地在我的用户模型中使用after_create :send_admin_email
开发了这样的电子邮件,效果很好。我的问题是我在测试期间(使用FactoryGirl)生成多个用户,并且每个创建的测试用户都会发送一封真实的电子邮件。运行我的测试就像在1月份浇糖蜜,我必须删除发送到我收件箱的数百封电子邮件。我怎么把它关掉?
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文件中。有没有办法可以在全球范围内关闭它?有人对发生的事情有任何想法吗?
答案 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中写 就我而言,这里的问题发生在使用“resque”作为后台工作者之后。最后,我发现以下配置为错误: 配置/初始化/ active_job.rb: ...因为它也影响了测试模式。 所以,我只在config / environments / {development,production.rb}中设置“queue_adapter =:resque”。现在,这正如我所料。Rails.application.config.active_job.queue_adapter = :resque # here is WRONG