代码之家  ›  专栏  ›  技术社区  ›  ngw

Faraday::ConnectionFailed的意外行为

  •  0
  • ngw  · 技术社区  · 6 年前

    Faraday::ConnectionFailed Faraday::TimeoutError 重试相同的方法 MAX_RETRIES

    这是涉及的主要方法:

    def benchmark_request(path)
      retries ||= 0
      request_start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
    
      response = yield
    
      total_request_seconds = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - request_start_time)
      Rails.logger.info "client request took (#{total_request_seconds}s): #{ENV['API_PATH_PREFIX']}#{path}"
    
      response
    rescue Faraday::ConnectionFailed, Faraday::TimeoutError => e
      retries += 1
      retry if retries <= MAX_RETRIES
    end
    

    调用的方法是:

     def get(path, params = {})
       benchmark_request(path) { token.get("#{ENV['API_PATH_PREFIX']}#{path}", params) }
     end
    

    token.get 来自 oauth2 正在使用的宝石 Faraday

    有趣的是。 我写了2个规范,每个我想处理的异常一个。

    context 'when the endpoint raises a ConnectionFailed' do
      let(:token_expires_at) { 1.hour.from_now.to_i }
      let(:response_body) { '' }
      let(:response_status) { 200 }
    
      before do
        allow(token).to receive(:get).and_raise(Faraday::ConnectionFailed)
        described_class.get(api_endpoint)
      end
    
      it 'is called MAX_RETRIES times' do
        expect(token).to have_received(:get).exactly(3).times
      end
    end
    
    context 'when the endpoint raises a TimeoutError' do
      let(:token_expires_at) { 1.hour.from_now.to_i }
      let(:response_body) { '' }
      let(:response_status) { 200 }
    
      before do
        allow(token).to receive(:get).and_raise(Faraday::TimeoutError)
        described_class.get(api_endpoint)
      end
    
      it 'is called MAX_RETRIES times' do
        expect(token).to have_received(:get).exactly(3).times
      end
    end
    

    测试 ConnectionFailed 失败,测试失败 TimeoutError 是绿色的。

    1) Client::Base.get when the endpoint raises a ConnectionFailed is called MAX_RETRIES times
     Failure/Error: token.get(path, params)
    
     ArgumentError:
       wrong number of arguments (given 0, expected 1..2)
     # /home/ngw/.rvm/gems/ruby-2.6.2/gems/faraday-0.15.4/lib/faraday/error.rb:7:in `initialize'
     # ./app/lib/client/base.rb:13:in `get'
     # ./spec/lib/client/base_spec.rb:111:in `block (4 levels) in <top (required)>'
    

    这显然是关于如何初始化异常的。

    0 回复  |  直到 6 年前
        1
  •  0
  •   MikeRogers0    5 年前
    before do
       allow(token).to receive(:get).and_raise(Faraday::TimeoutError, 'execution expired')
      described_class.get(api_endpoint)
    end
    

    我通过一个 second argument and_raise 方法。我想这是因为法拉第的异常类略有不同。

    推荐文章