gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:53:56 25 4
gpt4 key购买 nike

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

class EventMailer < BaseMailer
def event_added(user_id, event_id)
# do stuff and email user about the event
end
end

我调用这个 EventMailer像这样从内部 Event类(class):
class Event < Task
def notify_by_email(user)
EmailLog.send_once(user.id, id) do
EventMailer.delay(queue: 'mailer').event_added(user.id, id)
end
end
end

哪里 EmailLog是一个记录发送电子邮件的类。 .delay由 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

规范看起来像:
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

关于为什么这个规范失败以及我如何解决它的任何见解?奇怪的是,如果我输入 puts传递给 EmailLog.send_once 的块内的语句,它只打印一次,规范仍然报告 EventMailer.event_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

关于ruby-on-rails - RSpec:测试邮件程序是否只被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25922335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com