Как заглушить запрос / ответ в Ruby - PullRequest
0 голосов
/ 10 апреля 2020

Используя макет / заглушку RSpe c, как мне написать модульный тест для метода find_by_id?

Я хочу использовать RSpe c, а не WebMock или VCR. Как создать заглушку для запроса / ответа?

class RapidApiClient
  HOST_URL = 'https://brianiswu-open-brewery-db-v1.p.rapidapi.com/breweries'
  API_KEY  = 'private_api_key'

   def request_api(url)
    Excon.get(
      url,
      headers: {
        'X-RapidAPI-Host' => HOST_URL,
        'X-RapidAPI-Key' => 'API_KEY'
      }
    )
  end

 def find_by_id(id)
    response = request_api("#{HOST_URL}/#{id}")
    return nil if response.status != 200
    JSON.parse(response.body)
 end  
end

Ответ:

[
{"id":4 , "name":"Ban Brewing Company" , "brewery_type":"micro", "city":"Tulsa" , "state":"OK"}
{"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}
]

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете заглушить сам метод request_api, чтобы вам не приходилось делать HTTP-запрос, используя что-то вроде этого:

expect_any_instance_of(RapidApiClient)
    .to receive(:request_api)
    .and_return([
                  {"id":4 , "name":"Ban Brewing Company" , "brewery_type":"micro", "city":"Tulsa" , "state":"OK"}
                  {"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}
                ])

, если вы хотите заблокировать запрос / ответ Actaul.

Вы можете использовать метод get для библиотеки Excon следующим образом:

expect(Excon)
.to receive(:get)
.and_return(Excon::Response.new(
     :status => 200,
     :body => '[{"id":4 , "name":"Ban Brewing Company","brewery_type":"micro", "city":"Tulsa" , "state":"OK"},{"id":44,"name":"Tab Brewing" "brewery_type":"micro", "city":"Birmingham", "state":"MO"}]'
    ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...