rspec测试时,ActionMailer方法调用在模块中返回nil



我有一个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

如果我在开发中调用UserMailer.submission_reminder(current_user),它会像预期的那样返回一个Mail::Message对象。

在我的应用程序中,调用此方法的位置位于lib文件夹中的一个模块中:

module TimesheetSubmissionNotifier                            
  def self.send_submission_reminders
    User.all.each { |user| UserMailer.submission_reminder(user).deliver }
  end
end

当我在开发中调用TimesheetSubmissionNotifier.send_submission_reminders时,UserMailer.submission_remind(user)返回邮件消息并调用delivery,一切正常。

问题是,当我通过rspec测试调用TimesheetSubmissionNotifier.send_submission_reminders时,UserMailer.submission_reminder(user)返回nil

如果我直接从rspec测试中调用UserMailer.submission_reminder(user),它会像预期的那样返回mailer消息。

以下是我的config/environment/test.rb:中唯一与ActionMailer相关的行

config.action_mailer.delivery_method = :test 
config.action_mailer.default_url_options = { :host => 'localhost:3000' }

你知道为什么这个方法返回零吗?

对于那些有类似问题的人,我发现了这个问题。

我使用的是should_receive RSpec期望值,但我没有意识到它实际上创建了它所在类的mock。所以我完全模拟了UserMailer类,这意味着它永远不会到达实际的UserMailer类别。

我无法通过使用mock函数使其工作,因此我更改了测试,查看UserMailer.deliveries存储,并检查其中是否放入了正确数量的邮件,以及它们是否发送到了正确的电子邮件地址。

最新更新