Ruby on rails rspec测试时,ActionMailer方法调用在模块中返回nil
我有一门Ruby on rails rspec测试时,ActionMailer方法调用在模块中返回nil,ruby-on-rails,ruby-on-rails-3,rspec,actionmailer,Ruby On Rails,Ruby On Rails 3,Rspec,Actionmailer,我有一门ActionMailer课程 class UserMailer < ActionMailer::Base default from: "no-reply@spicy-millennium.com" def submission_reminder user @user = user mail :to => user.email, :subject => "Your timesheet needs to be submi
ActionMailer
课程
class UserMailer < ActionMailer::Base
default from: "no-reply@spicy-millennium.com"
def submission_reminder user
@user = user
mail :to => user.email, :subject => "Your timesheet needs to be submitted!"
end
end
当我在开发中调用TimesheetSubmissionNotifier.send_submission_Mementials时,UserMailer.submission_Mementials(用户)返回邮件消息并调用deliver,一切正常
问题是当我调用TimesheetSubmissionNotifier。通过rspec测试发送提交提醒时,UserMailer。提交提醒(用户)
返回零。
如果我直接从rspec测试调用UserMailer.submission\u remention(user)
,它会像预期的那样返回mailer消息
以下是我的config/environment/test.rb中与ActionMailer相关的唯一行:
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
你知道为什么这个方法返回nil吗?对于那些有类似问题的人,我发现了这个问题 我使用的是
should\u receive
RSpec期望值,我没有意识到它实际上创建了一个类的模拟。所以我完全模拟了UserMailer类,这意味着它永远不会到达实际的UserMailer类
我无法通过使用模拟函数使其工作,因此我更改了测试,查看
UserMailer.deliveries
存储,并检查是否将正确数量的邮件放入其中,以及它们是否发送到正确的电子邮件地址。当你说调用UserMailer.submission\u提醒(用户)
直接从rspec测试工作,如何初始化传递给该方法的用户对象?你可以从用户表中获得它,或者用工厂来构建它,等等?是的,我也这样做了,有一个简单的谷歌例子可以做到这一点。值得提醒的是,这是一种非常错误的测试方法。When_-receive正在模拟一个方法端点,但不定义任何类型的返回值,除非您明确地这样做(接收与接收电子邮件无关;-)。从技术上讲,When_-receive不创建模拟对象,它会将该方法存根并返回nil(rspec文档将其称为部分模拟)。您可以使用和_call _original调用原始方法。例如,应该接收(:提交提醒)和呼叫最初我们遇到了升级到rails 4的情况。我们使用了sidekiq延迟,它在升级过程中发生了更改,如果邮件程序返回nil,则会引发运行时错误“返回了无法送达的邮件对象”。Mailer.应该收到(:提交提醒)和原始呼叫修复了测试。
config.action_mailer.delivery_method = :test
config.action_mailer.default_url_options = { :host => 'localhost:3000' }