用geocoder gem测试

时间:2013-09-05 15:11:43

标签: ruby-on-rails testing rails-geocoder

我正在使用地理编码器gem,但我不知道我必须在哪个文件中粘贴this code。你能告诉我吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:8)

由于您未说明您的测试框架,我将给出具体的答案。

我正在使用Cucumber和Rspec。虽然以上所有内容都来自@DevDude和@malandrina,但这里有一个更完整的提示,代码可以去哪里,以及如何添加反向地理编码条目(lat / lon - >地址):

将您的存根放在spec文件夹中。我创建了一个数组数组,这样我就可以添加多个“查找”来删除:

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]) }

在Cucumber支持文件夹中引用您的存根:

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

希望这有帮助!

答案 2 :(得分:3)

将存根放入测试设置的另一种方法是在spec/support中定义它们:

规格/支持/ geocoder.rb

Geocoder.configure(lookup: :test)

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

虽然这种方法在将神秘客人引入测试方面存在缺点,但它确实会让事情干涸。

答案 3 :(得分:3)

我将此代码放在我的/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