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

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

Оцените материал
(3 голосов)
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

 

Вы в любой момент можете клонировать репозиторий 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.

Последнее изменениеПонедельник, 24 января 2022 05:14

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

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

Poker onRails

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

  • Aleksej Yes. You can see it, I switched the temperature from C to F in the module on this page (Costa… 2024-10-01 21:43:42
    jWeather by ip. Погода по ip для Joomla!
  • Anne Is it possible to change temperature to F vs C? 2024-10-01 18:55:58
    jWeather by ip. Погода по ip для Joomla!
  • Aleksej Первое, что бросается в глаза: период времени, прошедший между тем, как автор комментария разбросал аналогичный текст по нескольким интернет-площадкам рунета,… 2024-07-02 14:10:05
    Tobeamerica эмансипе
  • Валерий Л. Предыдущий отзыв неактуален. Это было недоразумение, мы его уладили. Компания вернула мне деньги, никаких претензий к ней я не имею.… 2024-07-01 17:10:43
    Tobeamerica эмансипе
  • Евгения Кличко Спасибо. 2024-06-25 01:03:32
    Joomla cache. Problems and solutions