rspec测试重试

ar7v8xwq  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(437)

我有一份这样的工作

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?

ny6fqffe

ny6fqffe1#

retry_on 不会在每次重试时立即调用块。只有当尝试用尽时。否则,它只会重新安排作业。
从文件中:
您还可以传递一个块,如果自定义逻辑的重试尝试失败,将调用该块,而不是让异常冒泡。生成此块时,作业示例作为第一个参数,错误示例作为第二个参数。

ncgqoxb0

ncgqoxb02#

我猜你是在测试activejob retry_on 将使作业排队,而不是立即执行,因此您可以尝试使用 ActiveJob::TestHelper 您的测试用例应该是:

require 'rails_helper'
RSpec.describe CrawlSsbJob, type: :job do
 include ActiveJob::TestHelper
 before(:all) do
   ActiveJob::Base.queue_adapter = :test
 end

 it "retries the job if session error" do
   allow(Ssb::Client).to receive(:get_data).and_raise(Ssb::SessionExpired)
   expect(Ssb::Login).to receive(:call)
   # enqueue job
   perform_enqueued_jobs {
    described_class.perform_later # or perform_now
   end
 end
end

相关问题