我有一个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
存储,并检查其中是否放入了正确数量的邮件,以及它们是否发送到了正确的电子邮件地址。