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

标签 ruby-on-rails ruby-on-rails-3 rspec actionmailer

我有一个 ActionMailer类(class)

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) 返回邮件消息并调用传递,一切正常。

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

如果我调用 UserMailer.submission_reminder(user)直接来自 rspec 测试,它会返回预期的邮件消息。

以下是我的 config/environment/test.rb 中与 ActionMailer 相关的唯一行:
config.action_mailer.delivery_method = :test 
config.action_mailer.default_url_options = { :host => 'localhost:3000' }

任何想法为什么该方法返回零?

最佳答案

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

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

我无法通过使用模拟函数让它工作,所以我改变了我的测试来查看 UserMailer.deliveries存储并检查是否有正确数量的消息被放入其中,并且它们被发送到正确的电子邮件地址。

关于ruby-on-rails - rspec 测试时,ActionMailer 方法调用在模块中返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9883894/

相关文章:

ruby-on-rails - 使用 Mongoid 将 active_storage 添加到 Rails6 应用程序?

javascript - 在 Ruby On Rails 中获取纬度和经度

ruby-on-rails - Rails App 中的持久 TCP 连接

ruby-on-rails - rails 3 :How to Sum up Record

ruby-on-rails-3 - Rails 3 rspec + capybara - current_path 为零?

ruby-on-rails - 尝试仅使用 delete_if 从 Active Record 集合中删除

ruby-on-rails - 如何在邮件模板中生成正确的 URL?

ruby-on-rails - 在 Rails 中使用 config.assets.precompile 将 Assets 包含在子目录中

ruby-on-rails - RSpec,在请求规范中验证设计用户

ruby - 在 Aptana 3 上运行 rspec