设计 3.5.2
rails 4.2.5
按照说明 here 中的定义,电子邮件发送已通过 ActiveJob 成功连接. Resque 正在成功处理发送电子邮件的作业(使用 Redis 作为数据存储。)
当 Redis 关闭时,我的 RSpec 功能测试失败并出现 Redis::CannotConnectError
。理想情况下,我希望我的功能测试能够触发设计电子邮件,但不发送任何内容。我测试了 deliveries
数组。
在 test.rb
中,我有:
config.action_mailer.delivery_method = :test
config.action_mailer.perform_deliveries = false
知道我真的在使用 Devise::Mailer
,我在 rails_helper
中明确设置了以下内容:
Devise::Mailer.delivery_method = :test
Devise::Mailer.perform_deliveries = false
当我在我的模型中点击以下方法时,我可以在运行测试时确认这些设置(通过 pry
断点)。
模型方法:
def send_devise_notification(notification, *args)
binding.pry
devise_mailer.send(notification, self, *args).deliver_later
end
pry(#<User>)> devise_mailer.perform_deliveries
=> false
pry(#<User>)> devise_mailer.delivery_method
=> :test
我的测试仍然因 Redis::CannotConnectError
异常而失败。
当我改变这一行时:
devise_mailer.send(notification, self, *args).deliver_later
到
devise_mailer.send(notification, self, *args).deliver_later unless Rails.env.test?
我的测试通过了。但是,这似乎是测试和生产代码的糟糕混合。
我在设计邮件程序的配置中缺少什么以防止在 RAILS_ENV=test
中发送电子邮件?
最佳答案
当 delivery_method 被设置为 test 时,一切仍然运行相同,唯一的区别是消息没有发送到 SMTP。
因此,在您的情况下,测试电子邮件仍然需要 Redis,因为 Resque 仍将处理它们,并且依赖 Redis 对它们进行排队。
因此您的选择是要么在测试中更改您的队列方法,要么在测试中运行 Redis,要么不要尝试在测试中发送。从最佳实践的角度来看,您应该发送测试和检查电子邮件以确认内容,因此一两个将成为最佳选择。
关于ruby-on-rails - 在测试中关闭来自 Devise 的电子邮件发送 (Rspec),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876798/