Запрос заглушки в геме Rails с постоянным HTTPClient

Я пытаюсь написать тест RSpec, который блокирует запросы к api.box.com с использованием гема Boxr ( https://github.com/cburnette/boxr). Я создал заглушку, которая идет в поддельный класс Box, используя метод #to_rack

stub_request(:any, %r{^https?://api.box.com}).to_rack(FakeBox)

и мой класс FakeBox:

require 'sinatra/base'

class FakeBox < Sinatra::Base
  post /oauth2/ do
    debugger
    content_type :json
    status 200
    '{ "access_token": "<some_token>", "expires_in": 3979, "restricted_to": [],' +
     '"refresh_token": "<some_refresh>",' +
     '"token_type": "bearer" }'
  end
end

Эта подделка срабатывает каждый раз, когда я звоню Net::HTTP.get('https://api.box.com/oauth2/token') или же HTTPClient.new.post(...) непосредственно в контроллере или в методе тестирования.

Тем не менее, это не срабатывает, когда я звоню Boxr::get_tokens(params[:code])Я поместил отладчик в само сокровище Boxr:

def self.auth_post(uri, body)
    uri = Addressable::URI.encode(uri)

    res = BOX_CLIENT.post(uri, body: body)
    debugger

    if(res.status==200)
      body_json = Oj.load(res.body)
      return BoxrMash.new(body_json)
    else
      raise BoxrError.new(status: res.status, body: res.body, header: res.header)
    end
  end

BOX_CLIENT определяется здесь:

module Boxr
  Oj.default_options = {:mode => :compat }

  #The root folder in Box is always identified by 0
  ROOT = 0

  #HTTPClient is high-performance, thread-safe, and supports persistent HTTPS connections
  #http://bibwild.wordpress.com/2012/04/30/ruby-http-performance-shootout-redux/
  BOX_CLIENT = HTTPClient.new
  BOX_CLIENT.cookie_manager = nil
  BOX_CLIENT.send_timeout = 3600 #one hour; needed for lengthy uploads
  BOX_CLIENT.agent_name = "Boxr/#{Boxr::VERSION}"
  BOX_CLIENT.transparent_gzip_decompression = true 
  #BOX_CLIENT.ssl_config.add_trust_ca("/Users/cburnette/code/ssh-keys/dev_root_ca.pem")

  def self.turn_on_debugging(device=STDOUT)
    BOX_CLIENT.debug_dev = device
    BOX_CLIENT.transparent_gzip_decompression = false
    nil
  end

  def self.turn_off_debugging
    BOX_CLIENT.debug_dev = nil
    BOX_CLIENT.transparent_gzip_decompression = true
    nil
  end
end

Когда запускается отладчик, полученный ответ показывает, что BOX_CLIENT.post(uri, body: body) посетил сайт и получил ошибку, когда я ожидал, что он вызовет макет. В консоли отладки на этой точке останова я ввел HTTPClient.new.post(uri, body: body) и я получил ошеломленный ответ, который я ожидал.

Когда я вошел HTTPClient.new.class в консоли отладчика я получил: WebMockHTTPClient. BOX_CLIENT.class -> HTTPClient. Это кажется источником моей проблемы.

Я не могу изменить драгоценный камень. У кого-нибудь есть идеи как решить эту проблему?

1 ответ

Просто пришлось удалить require: false от gem 'webmock', require: false в Gemfile

Другие вопросы по тегам