Воскресенье, 23 января 2022 04:38

API OpenWeatherMap. Тест метода контроллера Rails

Оцените материал
(0 голосов)
API OpenWeatherMap. Тестируем метод контроллера Rails
API OpenWeatherMap. Тестируем метод контроллера Rails

 

Короткой строкой набросаем тест 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

 

В качестве live demo вы в любой момент можете клонировать репозиторий CRUD-Blog и поэкспериментировать с описанными тестами.

 

Т. е. проверим получение данных погоды от API OpenWeatherMap, передавая те или иные координаты; пусть это будет геотаргетинг, например, новогоднего 2021 - 2022 Санкт-Петербурга.

 

API OpenWeatherMap. Тестируем метод контроллера Rails
API OpenWeatherMap. Тестируем метод контроллера Rails

 

Что же, как-то вот так. Получаемый раз от раза объект может и должен разниться, разумеется, в зависимости от состояния погоды и умонастроения социума; но ряд сопоставлений ключ => значение останутся неизменными, коль скоро передаваемые в параметрах координаты не меняются. Например:

 

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.

Оставить комментарий

Добавьте ваш комментарий

Комментарии в блоге