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

时间:2012-03-27 05:38:27

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:16)

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

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

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