2013-09-05 1 views

ответ

14

Этот фрагмент кода должен быть в разделе SETUP любого используемого тестового фрейма.

При использовании RSpec, он должен идти здесь:

describe Something do 
before(:all) do 
    Geocoder.configure(:lookup => :test) 

    Geocoder::Lookup::Test.add_stub(
    "New York, NY", [ 
    { 
     'latitude'  => 40.7143528, 
     'longitude' => -74.0059731, 
     'address'  => 'New York, NY, USA', 
     'state'  => 'New York', 
     'state_code' => 'NY', 
     'country'  => 'United States', 
     'country_code' => 'US' 
    } 
    ] 
) 
end 
end 
+0

Я использую RSpec ... –

+1

Я только что обновил ответ как на вашей обратной связи, имеют хороший один – DevDude

3

Альтернатива, чтобы положить свои окурки в испытательной установке, чтобы определить их в spec/support:

спецификации/поддержка/geocoder.rb

Geocoder.configure(lookup: :test) 

Geocoder::Lookup::Test.add_stub(
    ... 
) 
end 

В то время как этот подход имеет недостаток в том, что вы вводите гостей в тайны, это делает СУХОЙ вещи.

+1

Не забудьте обернуть это в 'module' с именем вашего выбора, если вы включают его в 'spec/rails_helper.rb', используя' config.include yourModuleName' –

7

Поскольку вы не указали свою тестовую структуру, я дам конкретный ответ.

Я использую огурец и Rspec. Хотя все вышеизложенное верно из @DevDude и @malandrina, вот более полный отзыв о том, где код может идти, и как добавить записи для обратного геокодирования (lat/lon -> address):

Поместите свои заглушки в папку spec. Я создал массив массивов, так что я мог бы добавить несколько «Lookups», чтобы быть затушил:

spec/support/geocoder_stubs.rb 
addresses = { 
    "230 West 43rd St., New York City, NY 10036" => { 
     'latitude' => 40.7573862, 
     'longitude' => -73.9881256, 
     'address' => '230 West 43rd St., New York City, NY 10036', 
     'city' => 'New York City', 
     'state' => 'New York', 
     'state_code' => 'NY', 
     'country' => 'United States', 
     'country_code' => 'US' 
    }, 
    [40.75747130000001, -73.9877319] => { 
     'latitude' => 40.75747130000001, 
     'longitude' => -73.9877319, 
     'address' => '229 West 43rd St., New York City, NY 10036', 
     'city' => 'New York City', 
     'state' => 'New York', 
     'state_code' => 'NY', 
     'country' => 'United States', 
     'country_code' => 'US' 
    }, 
    "Worthington, OH" => { 
    'latitude' => 40.09846115112305, 
    'longitude' => -83.01747131347656, 
    'address' => 'Worthington, OH', 
    'city' => 'Worthington', 
    'state' => 'Ohio', 
    'state_code' => 'OH', 
    'country' => 'United States', 
    'country_code' => 'US' 
    }, 
} 

Geocoder.configure(:lookup => :test) 
addresses.each { |lookup, results| Geocoder::Lookup::Test.add_stub(lookup, [results]) } 

Reference ваши окурки в папке поддержки Огурцов:

features/support/env.rb 
require Rails.root.join("spec/support/geocoder_stubs") 

Надеется, что это помогает!

1

Я помещаю этот код в свой /config/initializers/geocoder.rb с условным значением для Rails.env.test?. Я пробовал выше подходы, упомянутые @devDude, это получилось здорово, но я просто не хотел, чтобы реальные вызовы геокодирования были сделаны из моих тестов rspec даже по ошибке (у меня было много спецификаций, зависящих от этого во многих файлах) + этот подход будет работать для любого вида рамок тестирования (будь то testunit или mintests или с огурцом).

Вот как выглядит мой файл /config/initializers/geocoder.rb.

if Rails.env.test? 
    Geocoder.configure(:lookup => :test) 
    # Particular Look up 
    Geocoder::Lookup::Test.add_stub(
    "New York, NY", [ 
     { 
     'latitude'  => 40.7143528, 
     'longitude' => -74.0059731, 
     'address'  => 'New York, NY, USA', 
     'state'  => 'New York', 
     'state_code' => 'NY', 
     'country'  => 'United States', 
     'country_code' => 'US' 
     } 
    ] 
) 
    #default stub 
    Geocoder::Lookup::Test.set_default_stub(
    [ 
     { 
     'latitude'  => 40.7143528, 
     'longitude' => -74.0059731, 
     'address'  => 'New York, NY, USA', 
     'state'  => 'New York', 
     'state_code' => 'NY', 
     'country'  => 'United States', 
     'country_code' => 'US' 
     } 
    ] 
) 
else 
    Geocoder.configure(
    :timeout  => 3,   # geocoding service timeout (secs) 
    :lookup  => :google,  # name of geocoding service (symbol) 
    :language  => :en,   # ISO-639 language code 
    :units  => :mi,  # :km for kilometers or :mi for miles 
    :distances => :linear # :spherical or :linear 
) 
end