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