Запрос заглушки в геме 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