Тестирование геокодера Rails с помощью rspec

Я пытаюсь настроить свои тесты RSpec на использование заглушек, а не на использование сети для геокодирования.

Я добавил это:

before(:each) do
Geocoder.configure(:lookup => :test)
Geocoder::Lookup::Test.add_stub(
    "Los Angeles, CA", [{
                            :latitude    => 34.052363,
                            :longitude    => -118.256551,
                            :address      => 'Los Angeles, CA, USA',
                            :state        => 'California',
                            :state_code   => 'CA',
                            :country      => 'United States',
                            :country_code => 'US'
                        }],

)

конец

Я использую FactoryGirl для создания тестовых данных следующим образом:

FactoryGirl.define do
    factory :market do
    city 'Los Angeles'
    state 'CA'
    radius 20.0
  end
end

Широта/долгота правильно геокодируются и сохраняются в широте/долготе. Однако, когда я пытаюсь:

Market.near(params[:search])

он возвращает ноль .. Но если я просто использую поиск => :google, он работает так, как я и предполагал. У кого-нибудь это работало раньше, особенно метод ближнего геокодера?


person templeman15    schedule 09.09.2015    source источник
comment
ты когда-нибудь это понял? Я сейчас сталкиваюсь с точно такой же проблемой   -  person Alex Neigher    schedule 12.07.2017
comment
@AlexNeigher Смотрите мой ответ ниже.   -  person templeman15    schedule 08.11.2017


Ответы (1)


В итоге я вернулся к этому в новом проекте и понял это.

Документы по геокодеру фактически утверждают, что хэш должен иметь строковые ключи, а не символы. документация по геокодеру — см. примечания

i.e.

before(:each) do
    Geocoder.configure(:lookup => :test)
    Geocoder::Lookup::Test.add_stub(
        "Los Angeles, CA", [{
                                "latitude"    => 34.052363,
                                "longitude"    => -118.256551,
                                "address"      => 'Los Angeles, CA, USA',
                                "state"        => 'California',
                                "state_code"   => 'CA',
                                "country"      => 'United States',
                                "country_code" => 'US'
                            }],

    )
end

а не как я это сделал в исходном посте:

i.e. :latitude => 34.052363

В итоге я сделал что-то более динамичное:

# frozen_string_literal: true

module GeocoderStub
  def self.stub_with(facility)
    Geocoder.configure(lookup: :test)

    results = [
      {
          'latitude' => Faker::Address.latitude.first(9),
          'longitude' => Faker::Address.longitude.first(9)
      }
    ]

    queries = [facility.full_address, facility.zip]
    queries.each { |q| Geocoder::Lookup::Test.add_stub(q, results) }
  end
end

и на моей фабрике:

require './spec/support/geocoder_stub'

FactoryGirl.define do
  factory :facility do
    name { Faker::Company.name }
    rating { rand(1..5) }
    street { Faker::Address.street_address }
    city { Faker::Address.city }
    state { Faker::Address.state }
    zip { Faker::Address.zip_code }

    after(:build) { |facility| GeocoderStub.stub_with(facility) }
  end
end

Это добавляет заглушку геокодера для каждой фабрики объекта, созданную как для полного адреса (метод, определенный в объекте), так и для почтового индекса.

person templeman15    schedule 08.11.2017
comment
:сердце: :сердце: :сердце: - person Babbz77; 07.08.2018
comment
лучшее решение — использовать vcr для блокировки всех HTTP-запросов. - person Fabrizio Bertoglio; 04.08.2019