【问题标题】:Turn off email sends from Devise in test (Rspec)在测试中关闭来自 Devise 的电子邮件发送 (Rspec)
【发布时间】:2023-03-08 01:45:01
【问题描述】:

设计 3.5.2
导轨 4.2.5

电子邮件发送已通过 ActiveJob 成功连接,如说明 here 中所定义。 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 中传递?

【问题讨论】:

    标签: ruby-on-rails rspec devise


    【解决方案1】:

    当 delivery_method 设置为 test 时,一切仍然运行相同,唯一的区别是邮件没有发送到 SMTP。

    因此,在您的情况下,测试电子邮件仍需要 Redis,因为 Resque 仍将处理它们,并依赖 Redis 将它们排队。

    因此,您的选择是在测试中更改队列方法,在测试中运行 Redis,或者不尝试在测试中发送。从最佳实践的角度来看,您应该发送测试并检查电子邮件以确认内容,因此最好选择一两封。

    【讨论】:

    • 您能否更详细地解释一下(“在测试中更改您的队列方法”)?
    • 请参阅此处的第 4.2 节 edgeguides.rubyonrails.org/active_job_basics.html 我建议将延迟作业作为一个不错的选择,因为它可以基于与您的应用程序相同的数据库后端,而不是使用像 Resque 之类的不同的东西
    • 它确实受到尊重,但直到 Resque 处理完电子邮件并将其发送出去后才会生效。您不是在告诉 Rails 不要将任何内容放入队列中,而是在告诉它不要发送电子邮件。发送电子邮件发生在它被放入队列之后。
    猜你喜欢
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2013-05-30
    • 2011-12-19
    • 1970-01-01
    • 2014-11-14
    相关资源
    最近更新 更多