如何使用 Minitest 测试轮询外部 api?
How to test polling an external api with Minitest?
我尝试模拟并存根 BaseApi.authenticate
和 BaseApi::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
备注:
- 重试机制相关代码省略
- 我们使用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
我尝试模拟并存根 BaseApi.authenticate
和 BaseApi::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
备注:
- 重试机制相关代码省略
- 我们使用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