ruby-on-rails - 在测试中关闭来自 Devise 的电子邮件发送 (Rspec)

标签 ruby-on-rails rspec devise

设计 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/

相关文章:

ruby-on-rails - RoR : Devise: After logging in, 重定向到登录页面,登录后如何设置重定向?

ruby-on-rails - 如何在 Rails 4 中设置自定义字符串外键?

ruby-on-rails - 捆绑 geoip-c - 给出错误 "you must have geoip c library installed"

ruby-on-rails - 如何定义以两种不同方式相互关联的两个模型之间的 ActiveRecord 关系?

javascript - Ajax调用错误跨源请求: Pulling list of universities for autocomplete in rails

Rspec 测试延迟作业

ruby-on-rails - PG::错误:错误:关系 "users"不存在

ruby-on-rails - 使用 RSpec 和 Haml 测试嵌套布局助手

ruby-on-rails - 设计密码加密

ruby-on-rails - json post 来设计原因 422/不可处理的实体