如何使用 Minitest 测试轮询外部 api?

How to test polling an external api with Minitest?

我尝试模拟并存根 BaseApi.authenticateBaseApi::TrackableJob(它们是 api 请求)但失败了。

module BaseApis
  class PollTrackableJobWorker
    include Sidekiq::Worker

    ...

    def perform(job_id, _invoice_id)
      BaseApi.authenticate(1) do
        response = BaseApi::TrackableJob.find(job_id).first

        case response['status']
        when 'done' then true
        when 'error' then Bugsnag.notify(response['errors'])
        when 'pending' || 'running' then raise EDocumentNotSentError
        end
      end
    end
  end
end

备注:

  1. 重试机制相关代码省略
  2. 我们使用mocha gem.

有人可以帮忙吗?

事实证明,我想多了,yields 方法是解决方案:

test 'status is done' do
  response = {
    'type'       => 'trackable_jobs',
    'id'         => '0b6ffad9177aeb594ad54af0',
    'status'     => 'done',
    'errors'     => nil
  }

  BaseApi.expects(:authenticate).with(1).yields
  BaseApi::TrackableJob.stubs(:find).returns([response])

  assert_equal(true, BaseApis::PollTrackableJobWorker.new.perform('xxx', 123))
end