Тесты RSpec для RestClient::Request.execute: Есть ли способ увидеть запрос?

Я использую гем RestClient для создания клиента API, и вызовы API обрабатываются этим методом здесь

  def call(api_name,api_endpoint,token = nil,*extra_params)
    endpoint = fetch_endpoint(api_name,api_endpoint)
    params = {}
    endpoint['params'].each_with_index { |p,i| params[p] = endpoint['values'][i] }
    puts params
    if token.nil? then
      response = RestClient::Request.execute(method: endpoint['method'], url: endpoint['url'], params: params.to_json)
    else
      response = RestClient::Request.execute(method: endpoint['method'], url: endpoint['url'], headers: {"Authorization" => "Bearer #{token}"}, params: params.to_json)
    end
    response
  end

Как видите, все, что я делаю, это монтирую хэш с параметрами/значениями для вызова и вызываю RestClient::Request#execute для получения ответа.

Бывает, что некоторые из моих тестов, как этот

it 'request_autorization' do
  obj = SpotifyIntegration.new
  response = obj.call('spotify','request_authorization',nil,state: obj.random_state_string)
  myjson = JSON.parse(response.body)
  expect(myjson).to eq({})
end

возвращают ошибку 400 Bad request, и я действительно не знаю, почему. Другие тесты, такие как этот

it 'my_playlists (with no authorization token)' do
  obj = SpotifyIntegration.new
  expect {
    response = obj.call('spotify','my_playlists')
  }.to raise_error(RestClient::Unauthorized,'401 Unauthorized')
end

обработаны по тому же методу, работают отлично.

Есть ли способ увидеть отправленный запрос? Я имею в виду, посмотрите, как RestClient монтирует/отправляет мой запрос в соответствующий API? Может быть, так я мог понять, что происходит.

Под «увидеть запрос» я имею в виду что-то вроде

puts RestClient::Request.prepared_request

or

puts RestClient::Request.prepared_url

Я просмотрел документацию RestClient и не нашел ничего похожего, но, возможно, некоторые из вас знают, как это сделать.


person Ed de Almeida    schedule 23.02.2017    source источник
comment
Дает ли вам .new вместо .execute что-то, с чем вы можете работать? Просто предположил, основываясь на документах здесь   -  person max pleaner    schedule 24.02.2017
comment
Я собираюсь проверить. Есть некоторые возможности, действительно. Спасибо!   -  person Ed de Almeida    schedule 24.02.2017
comment
Вы можете попробовать использовать RestClient.log, чтобы получить больше информации, или использовать WebMock, чтобы проверить, что вы видите веб-запросы, сгенерированные так, как вы ожидаете.   -  person A B    schedule 24.02.2017
comment
Я бы использовал WebMock или что-то подобное, чтобы получить достойную тестовую производительность. Если вы используете опцию WebMock.disable_net_connect!, она покажет вам сделанный запрос.   -  person Marc Rohloff    schedule 24.02.2017
comment
Спасибо @MarcRohloff.   -  person Ed de Almeida    schedule 24.02.2017
comment
Спасибо @alberge. Установка RestClient.log на stdout путем выполнения RESTCLIENT_LOG=stdout rspec сделала работу, и я мог видеть запрос. Если вы опубликуете это как ответ, я буду рад принять его.   -  person Ed de Almeida    schedule 24.02.2017


Ответы (1)


Вы можете попробовать использовать RestClient.log для получения дополнительной информации. Что-то типа:

RestClient.log = STDOUT

WebMock также является отличной тестовой средой для HTTP-запросов. Тесты для самого rest-client часто используют WebMock.

person A B    schedule 24.02.2017