我有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的任何想法?
答案 0 :(得分:16)
对于那些有类似问题的人,我发现了这个问题。
我正在使用should_receive
RSpec期望,我没有意识到实际上创建了它所放置的类的模拟。所以我完全嘲笑UserMailer类,这意味着它永远不会到达实际的UserMailer类。
我无法通过使用模拟函数来实现它,所以我改变了我的测试以查看UserMailer.deliveries
商店并检查是否放入了正确数量的消息并且它们是否被发送到正确的电子邮件地址。