Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.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:测试邮件程序是否只被调用一次_Ruby On Rails_Rspec_Stub - Fatal编程技术网

Ruby on rails RSpec:测试邮件程序是否只被调用一次

Ruby on rails RSpec:测试邮件程序是否只被调用一次,ruby-on-rails,rspec,stub,Ruby On Rails,Rspec,Stub,我有一个Mailer,看起来像这样: class EventMailer < BaseMailer def event_added(user_id, event_id) # do stuff and email user about the event end end 其中,EmailLog是记录已发送电子邮件的类延迟由Sidekiq添加 但当我尝试测试每个事件和用户只调用一次#notify_by_email时,我的规范失败: 1) Event#notify_by_ema

我有一个
Mailer
,看起来像这样:

class EventMailer < BaseMailer
  def event_added(user_id, event_id)
    # do stuff and email user about the event
  end
end
其中,
EmailLog
是记录已发送电子邮件的类<代码>延迟由Sidekiq添加

但当我尝试测试每个事件和用户只调用一次
#notify_by_email
时,我的规范失败:

1) Event#notify_by_email only sends once per user
     Failure/Error: expect(EventMailer).to receive(:event_added).once
       (<EventMailer (class)>).event_added(any args)
           expected: 1 time with any arguments
           received: 0 times with any arguments

对这个规范失败的原因以及我如何修复它有什么见解吗?奇怪的是,如果我将
语句放入传递给
EmailLog.send\u once
的块中,它只打印一次,规范仍然报告
EventMailer.event\u added
没有调用。

您的期望应该在测试代码之前声明。使用
expect(…)。to receive(…)
基本上意味着“从现在到本规范结束之间应该收到此消息”。因为期望是规范的最后一行,所以它失败了

试着在之前移动它,你应该准备好了:

it 'only sends once per user' do
  expect(EventMailer).to receive(:event_added).once

  event.notify_by_email(owner)
  event.notify_by_email(owner)
end
let(:owner) { User.make! }
let(:product) { Product.make! }
let(:event) { Task.make!(user: owner, product: product) }

describe '#notify_by_email' do
  before do
    EventMailer.stub(:delay).and_return(EventMailer)
  end

  it 'only sends once per user' do
    event.notify_by_email(owner)
    event.notify_by_email(owner)

    expect(EventMailer).to receive(:event_added).once
  end
end
it 'only sends once per user' do
  expect(EventMailer).to receive(:event_added).once

  event.notify_by_email(owner)
  event.notify_by_email(owner)
end