我使用的是faraday,并且我已经实现了一个重试机制,它工作正常,但我不知道如何在rspec上测试它。
下面是我的重试机制:
def perform(url:)
max_retries = 3
retry_count = 0
delay = 1
begin
req = config_faraday
response = req.get(url)
JSON.parse(response.body)
rescue Faraday::Error => err
puts "Request failed. Retries left: #{max_retries - retry_count}"
sleep delay += retry_count
retry_count += 1
retry if retry_count < max_retries
ensure
if retry_count == max_retries
raise ApiError.new("Number of retries has been exhausted")
end
end
end我不知道如何处理when api is not working的情况
我通过截断get请求并将retry_count设置为最大值,然后尝试命中该请求来编写:
context 'Api is not working' do
let(:retry_count){
3
}
before do
request = double(Faraday)
allow(request).to receive(:get).and_raise(Faraday::Error)
end
it "raise error after retries" do
expect(Products::Fetcher.perform(url: url)).to raise_error(Products::ApiError)
end
end但是我得到了一个错误:
Products::Fetcher Api is not working raise error after retries
Failure/Error: expect(Products::Fetcher.perform(url: url)).to raise_error(Products::ApiError)
expected Products::ApiError but was not given a block
# ./spec/services/products/fetcher_spec.rb:34:in `block (3 levels) in <top (required)>'发布于 2018-03-26 19:12:08
奇怪的是:您的测试本身并不测试perform的任何代码。这有时是好的,但在这种情况下,它们似乎不会测试您的存根以外的任何东西。
对于API测试,我建议使用像vcr这样的gem。但这不会重现失败,然后重试,然后成功。
为了测试,从您展示的代码中,我将存根config_faraday以返回一个模拟对象,这将在调用get时引发两次错误,并在第三次调用时返回主体。
发布于 2019-05-08 19:54:28
raise_error匹配器的错误语法为:
expect { raise StandardError }.to raise_error您的示例:
expect(Products::Fetcher.perform(url: url)).to raise_error(Products::ApiError)所以正确的形式应该是:
expect{ Products::Fetcher.perform(url: url) }.to raise_error(Products::ApiError)https://stackoverflow.com/questions/49489328
复制相似问题