我有一份这样的工作
class CrawlSsbHistory < BaseJob
retry_on(Ssb::SessionExpired) do
Ssb::Login.call
end
def perform
response = Ssb::Client.get_data
SsbHistory.last.destroy
end
end
我有这样的测试
it "retries the job if session error" do
allow(Ssb::Client).to receive(:get_data).and_raise(Ssb::SessionExpired)
allow(Ssb::Login).to receive(:call)
described_class.perform_now # it is CrawlSsbHistory
expect(Ssb::Login).to have_received(:call)
end
爬网历史是一项对一些数据进行爬网的工作。它调用ssb::client.get_data来获取数据。
在ssb::client.get_数据内部,如果会话过期,我将引发ssb::sessionexpired。因此,我可以使用retry_on捕获作业中引发的错误。如果真的发生了,我想试试这个工作。
但我犯了这样的错误
(Ssb::Login (class)).call(*(any args))
expected: 1 time with any arguments
received: 0 times with any arguments
作业无呼叫是否重试?还是我测试错了?如何制作一个rspec来测试retry_on是否正常工作,以及是否调用了ssb::login.call?
2条答案
按热度按时间ny6fqffe1#
retry_on
不会在每次重试时立即调用块。只有当尝试用尽时。否则,它只会重新安排作业。从文件中:
您还可以传递一个块,如果自定义逻辑的重试尝试失败,将调用该块,而不是让异常冒泡。生成此块时,作业示例作为第一个参数,错误示例作为第二个参数。
ncgqoxb02#
我猜你是在测试activejob
retry_on
将使作业排队,而不是立即执行,因此您可以尝试使用ActiveJob::TestHelper
您的测试用例应该是: