Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rspec测试时,ActionMailer方法调用在模块中返回nil_Ruby On Rails_Ruby On Rails 3_Rspec_Actionmailer - Fatal编程技术网

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

Ruby on rails rspec测试时,ActionMailer方法调用在模块中返回nil,ruby-on-rails,ruby-on-rails-3,rspec,actionmailer,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 submi

我有一门
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
当我在开发中调用TimesheetSubmissionNotifier.send_submission_Mementials时,UserMailer.submission_Mementials(用户)返回邮件消息并调用deliver,一切正常

问题是当我调用
TimesheetSubmissionNotifier。通过rspec测试发送提交提醒时,
UserMailer。提交提醒(用户)
返回零。

如果我直接从rspec测试调用
UserMailer.submission\u remention(user)
,它会像预期的那样返回mailer消息

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

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

你知道为什么这个方法返回nil吗?

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

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


我无法通过使用模拟函数使其工作,因此我更改了测试,查看
UserMailer.deliveries
存储,并检查是否将正确数量的邮件放入其中,以及它们是否发送到正确的电子邮件地址。

当你说调用
UserMailer.submission\u提醒(用户)
直接从rspec测试工作,如何初始化传递给该方法的用户对象?你可以从用户表中获得它,或者用工厂来构建它,等等?是的,我也这样做了,有一个简单的谷歌例子可以做到这一点。值得提醒的是,这是一种非常错误的测试方法。When_-receive正在模拟一个方法端点,但不定义任何类型的返回值,除非您明确地这样做(接收与接收电子邮件无关;-)。从技术上讲,When_-receive不创建模拟对象,它会将该方法存根并返回nil(rspec文档将其称为部分模拟)。您可以使用和_call _original调用原始方法。例如,应该接收(:提交提醒)和呼叫最初我们遇到了升级到rails 4的情况。我们使用了sidekiq延迟,它在升级过程中发生了更改,如果邮件程序返回nil,则会引发运行时错误“返回了无法送达的邮件对象”。Mailer.应该收到(:提交提醒)和原始呼叫修复了测试。
config.action_mailer.delivery_method = :test 
config.action_mailer.default_url_options = { :host => 'localhost:3000' }