Тестирование Rails Rspec с помощью WebMock. Инициализировать класс заглушки, если не производственная среда?

Я новичок в тестировании и столкнулся с небольшой проблемой при тестировании ответов на внешние зависимости.

Мой вариант использования заключается в том, что у меня есть драгоценный камень Foo, который отправляет обратно некоторые данные на основе переданных данных. Я использую этот гем, когда инициализирую класс FooBar. Код для этого выглядит примерно так:

require 'foo'
class FooBar
  attr_accessor :thing

  def initialize(name)
    @thing = Foo(thing)
  end
end

Я хочу иметь возможность заглушить инициализацию класса FooBar в моей тестовой среде rails, но разрешить обработку внешнего запроса в моей производственной среде. В моей тестовой среде я хотел бы просто вернуть экземпляр FooBar с предварительно заданными значениями. Сейчас я просто пытаюсь вернуть строку.

Я пытаюсь использовать драгоценный камень WebMock для остановки инициализации FooBar прямо сейчас с помощью:

require 'webmock/rspec'
  WebMock.disable_net_connect!(allow_localhost: true)

  RSpec.configure do |config|
    config.before(:each) do
      allow(foo_bar).to receive(:new).and_return('stubbed')
    end
  end
end

С этим в моем файле spec_helper и моими тестами, проверяющими инициализацию FooBar на «заглушение». Конкретная ошибка, которую он выдает:

FooBar When I initialize class FooBar should be a string
FooBar
Failure/Error: Unable to find matching line from backtrace
NameError:
undefined local variable or method `foo_bar' for 
#<RSpec::ExampleGroups::FooBar::WhenIInitializeClassFooBar>

Есть ли что-то очевидное, что я упускаю?


person CarlyL    schedule 12.01.2016    source источник


Ответы (1)


Вам нужно определить foo_bar как

foo_bar = FooBar.new

а затем используйте его, как в своем коде.

allow(foo_bar).to receive(:new).and_return('stubbed')

OR

вы также можете обобщить его для любого экземпляра FooBar. Затем создайте его экземпляры для использования в тестах.

allow_any_instance_of(FooBar).to receive(:new).and_return('stubbed')
person rohan    schedule 12.01.2016
comment
Оба они по-прежнему выполняют внешний вызов, который прерывается при запуске в тестовой среде rails. :( - person CarlyL; 12.01.2016