首页 > 解决方案 > Rspec 测试 retry_on

问题描述

我有这样的工作

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

CrawlSsbHistory 是一项抓取一些数据的工作。它调用 Ssb::Client.get_data 来获取数据。

在 Ssb::Client.get_data 内部,如果会话过期,我会提出 Ssb::SessionExpired。所以我可以使用 retry_on 捕获作业中引发的错误。然后,如果发生这种情况,我想尝试这份工作。

但我有这样的错误

(Ssb::Login (class)).call(*(any args))
           expected: 1 time with any arguments
           received: 0 times with any arguments

作业没有调用retry_on 吗?还是我测试错了?如何制作 rspec 来测试 retry_on 是否正常工作并调用 Ssb::Login.call?

标签: ruby-on-railsrubyrspecrspec-rails

解决方案


retry_on每次重试时不会立即调用该块。只有当尝试用尽时。否则,它只会重新安排工作。

文档

如果自定义逻辑的重试尝试失败,您还可以传递一个将被调用的块,而不是让异常冒泡。生成此块时,作业实例作为第一个参数,错误实例作为第二个参数。


推荐阅读