Rspec проверяет ответ Httparty

#ruby #rspec #httparty

Вопрос:

У меня есть такое определение

 require 'httparty'
def distance_calculation
    url = "https://api.distancematrix.ai/maps/api/distancematrix/json?origins=# 
    {@departure}amp;destinations=#{@destination}amp;key=lugtcyuuvliub;o;o"
    response = HTTParty.get(url)
    distance = response.parsed_response["rows"].first["elements"].first["distance"]. 
    ["text"]

end
 

Завершение теста rspec:

 describe "#cargo" do
  context "distance" do
    it "returns hash with destination addresses, origin addresses amp; rows of datas" do
  end
end
 

Из анализа URL-адресов я получаю хэш, в котором ключами являются адреса назначения, адреса происхождения, расстояние и продолжительность.
Как проверить по определению Rspec, в котором используется драгоценный камень httparty, и он ничего не возвращает, просто записывает проанализированное поле (расстояние в км) в переменную.

Ответ №1:

Вы можете заглушить HTTParty.get метод, подобный этому рабочему примеру:

 require "rails_helper"

class MyClass
  def distance_calculation
    url = "https://api.distancematrix.ai/maps/api/distancematrix/json?origins=fooamp;destinations=baramp;key=lugtcyuuvliub;o;o"
    response = HTTParty.get(url)
    distance = response.parsed_response["rows"].first["elements"].first["distance"]["text"]
  end
end

RSpec.describe MyClass do
  # you can write some helper methods inside your class test
  def wrap_elements_body(elements)
    {
      rows: [{
        elements: elements
      }]
    }
  end

  def build_distance_body_response(distance)
    item = { distance: { text: distance } }
    wrap_elements_body([item])
  end

  def stub_request_with(body)
    body = JSON.parse(body.to_json) # just to convert symbol keys into string
    response = double(parsed_response: body)

    allow(HTTParty).to receive(:get).and_return(response)
  end


  describe "#cargo" do
    context "distance" do
      it "returns hash with destination addresses, origin addresses amp; rows of datas" do

        # stubbing 
        expected_distance = 100.0
        body_response = build_distance_body_response(expected_distance)
        stub_request_with(body_response)

        # running 
        calculated_distance = described_class.new.distance_calculation

        # expectations
        expect(calculated_distance).to eq(expected_distance)
      end
    end
  end
end

 

Затем вы можете экспортировать эти вспомогательные методы в вспомогательный класс внутри пакета RSpec для использования в других местах.

Мне нравится создавать эти вспомогательные методы вместо использования https://github.com/vcr/vcr потому что я могу больше контролировать то, что я хочу и использую.

Комментарии:

1. Спасибо за помощь. А как насчет Webmock для запроса стаббинга? Не могли бы вы, пожалуйста, помочь мне в этом вопросе?

2. Я никогда не использовал Webmock, но это тоже кажется очень хорошим решением. Под капотом он будет делать что-то вроде приведенного здесь примера, но, я думаю, более гибким способом