Короткой строкой набросаем тест RSpec, отвечающий за работоспособность метода контроллера, который выглядит у меня вот так, просто и незамысловато:
def weather(*args)
@obj = Openweathermap.current_weather_data(*args)
end
class Openweathermap
def self.current_weather_data(*args)
uri = URI(url(*args))
response = Net::HTTP.get(uri)
JSON.parse(response)
end
def self.url(*args)
'http://api.openweathermap.org/data/2.5/weather?lat=' +
args[0].to_s +
'&lon=' +
args[1].to_s +
'&appid=' +
ENV['KEY_OPENWEATHERMAP'] +
'&units=metric'
end
end
Вы в любой момент можете клонировать репозиторий CRUD-Blog и самостоятельно поэкспериментировать с кодом.
Т. е. проверим получение данных погоды от API OpenWeatherMap, передавая те или иные координаты; пусть это будет геотаргетинг, например, новогоднего 2021 - 2022 Санкт-Петербурга.
Что же, как-то вот так. Получаемый раз от раза объект может и должен разниться, разумеется, в зависимости от состояния погоды и умонастроения социума; но ряд сопоставлений ключ => значение останутся неизменными, коль скоро передаваемые в параметрах координаты не меняются. Например:
require 'rails_helper'
RSpec.describe ContactsController, type: :controller do
subject { controller.weather('59.8944', '30.2642') }
it 'should return these keys/values' do
expect(subject).to include(
'name' => 'Saint Petersburg',
'base' => 'stations',
'cod' => 200,
'timezone' => 10800
)
end
end
Впрочем, с лихвой хватило бы и какого-то одного элемента; если API не примет ключ доступа, например, тест однозначно не пройдет. Что и требовалось:
F
Failures:
1) ContactsController should return these keys/values
Failure/Error:
expect(subject).to include(
'name' => 'Saint Petersburg',
'base' => 'stations',
'cod' => 200,
'timezone' => 10800
)
expected {"cod" => 401, "message" => "Invalid API key. Please see http://openweathermap.org/faq#error401 for more info."} to include {"name" => "Saint Petersburg", "base" => "stations", "cod" => 200, "timezone" => 10800}
Тем не менее, мы без проблем могли бы использовать (или добавить к описанному выше тесту) еще и такую логику, проверяя наличие любых ключей, без значений. Допустим, облачность:
it 'includes clouds key' do
expect(subject).to have_key('clouds')
end
Done.
Комментарии в блоге