Create a gist now

Instantly share code, notes, and snippets.

Geocoder: Stub out address geocoding during RSpec unit tests
# In spec_helper:
# RSpec.configure do |config|
# ...
# config.include(MockGeocoder)
# end
#
# In your tests:
# it 'mock geocoding' do
# mock_geocoding! # You may pass additional params to override defaults (i.e. :coordinates => [10, 20])
# address = Factory(:address)
# address.lat.should eq(1)
# address.lng.should eq(2)
# end
require 'geocoder/results/base'
module MockGeocoder
def self.included(base)
base.before :each do
::Geocoder.stub(:search).and_raise(RuntimeError.new 'Use "mock_geocoding!" method in your tests.')
end
end
def mock_geocoding!(options = {})
options.reverse_merge!(:address => 'Address', :coordinates => [1, 2], :state => 'State', :state_code => 'State Code', :country => 'Country', :country_code => 'Country code')
MockResult.new.tap do |result|
result.stub options
Geocoder.stub :search => [result]
end
end
class MockResult < ::Geocoder::Result::Base
def initialize(data = [])
super(data)
end
end
end
@dtuite
dtuite commented Oct 14, 2011

Hi. I'm having a problem using this because the Geocoder::Result module isn't found.

spec/support/mock_geocoder.rb:37:in `<module:MockGeocoder>': uninitialized constant Geocoder::Result (NameError)

As far as I can tell, it's never loaded by Geocoder.

Do I need to require this file specifically? How do I do that?

@jmccartie

@dtuite Did you ever figure it out?

@dtuite
dtuite commented Oct 27, 2011

@jmccartie I'm afraid not. Let me know if you get anywhere please.

@jmccartie

@dtuite I bailed on trying to stub out the object and used FakeWeb instead.

@PavelTyk
Owner

add require 'geocoder/results/base' at the top of gist

@glittershark

For anyone using Rspec 2+, I made a fork that works with the new expect syntax.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment