Геокодирование адреса заглушки во время модульного тестирования RSpec

Я использую гем geocoder, чтобы добавить функцию геокодирования в один из моих классов модели Active Record. Это отлично работает, но на самом деле я не хочу, чтобы геокодирование запускалось во время модульных тестов.

Я попытался заглушить вызов геокодирования, добавив это в свой тест RSpec:

before (: each) do
User.stub! (: geocode) .and_return ([1,1]) end

Однако, когда я запускаю свои тесты, кажется, что он все еще требует геокодирования. Что я делаю неправильно?

К вашему сведению, все это работает, если я использую заглушку на уровне экземпляра (например, some_user.stub! Вместо User.stub!).


person Kevin Pang    schedule 13.04.2011    source источник
comment
вы используете геокодирование в своем приложении, например user = User.first, а затем user.geocode?   -  person Vasiliy Ermolovich    schedule 13.04.2011
comment
Просто к сведению, еще один ресурс для геокодирования и отображения карт Google: github.com/apneadiving/Google- Maps-for-Rails   -  person apneadiving    schedule 13.04.2011
comment
Посмотрите мою реализацию: Gist: gist.github.com/1275502 Мои заметки: code-snippets.paveltyk.info/snippets/80   -  person    schedule 10.10.2011


Ответы (2)


Если вы хотите использовать заглушки на уровне экземпляра, вам следует использовать другую структуру имитации, кроме RSpec. Например, это mocha (добавьте в spec/spec_helper.rb следующее):

Spec::Runner.configure do |config|
  config.mock_with :mocha
end

http://rspec.info/documentation/mocks/other_frameworks.html

Теперь вы можете использовать any_instance в своих тестах:

before(:each) do
 User.any_instance.stub(:geocode).and_return([1,1]) 
end
person Vasiliy Ermolovich    schedule 13.04.2011
comment
Это работает, если вас интересует только возвращаемое значение: geocode. Но модуль геокодера фактически обновляет широту и долготу объекта. Как бы мне это заглушить? - person harrism; 07.02.2012
comment
Фактически, предоставленный вами код работает с RSpec ›= 2.6, но не с Mocha. - person declan; 21.05.2012
comment
@harrism немного поздно, но я решил подойти к нему вот так, заглушив широту и долготу в дополнение к основному методу геокодирования: Restaurant.any_instance.stub(:geocode).and_return([1, 1]) Restaurant.any_instance.stub(:latitude).and_return(1) Restaurant.any_instance.stub(:longitude).and_return(1) - person shedd; 18.04.2014

it's

before(:each) do 
  Address.any_instance.stubs(:geocode).returns([1,1])
end

с мокко.

person fmalamitsas    schedule 08.06.2011