首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于重试机制的Rspec

用于重试机制的Rspec
EN

Stack Overflow用户
提问于 2018-03-26 18:32:15
回答 2查看 1.1K关注 0票数 1

我使用的是faraday,并且我已经实现了一个重试机制,它工作正常,但我不知道如何在rspec上测试它。

下面是我的重试机制:

代码语言:javascript
复制
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设置为最大值,然后尝试命中该请求来编写:

代码语言:javascript
复制
  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

但是我得到了一个错误:

代码语言:javascript
复制
 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)>'
EN

回答 2

Stack Overflow用户

发布于 2018-03-26 19:12:08

奇怪的是:您的测试本身并不测试perform的任何代码。这有时是好的,但在这种情况下,它们似乎不会测试您的存根以外的任何东西。

对于API测试,我建议使用像vcr这样的gem。但这不会重现失败,然后重试,然后成功。

为了测试,从您展示的代码中,我将存根config_faraday以返回一个模拟对象,这将在调用get时引发两次错误,并在第三次调用时返回主体。

票数 0
EN

Stack Overflow用户

发布于 2019-05-08 19:54:28

raise_error匹配器的错误语法为:

代码语言:javascript
复制
expect { raise StandardError }.to raise_error

您的示例:

代码语言:javascript
复制
expect(Products::Fetcher.perform(url: url)).to raise_error(Products::ApiError)

所以正确的形式应该是:

代码语言:javascript
复制
expect{ Products::Fetcher.perform(url: url) }.to raise_error(Products::ApiError)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49489328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档