Воскресенье, 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

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