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