У меня есть проект, который теперь использует RSpec 3, но по-прежнему содержит (теперь устаревший) синтаксис RSpec 2 для методов stubbing.Метод Rails/rspec удваивается вместо any_instance.stub
В настоящее время мы активно используем:
Class::OtherClass.any_instance.stub(:method)
Они вызываются из модуля моделирования, который включен в модели ActiveRecord (это важно в секунду).
Методы моделирования выходят из спецификаций, исходя из того, должно ли приложение запускать свои спецификации для реального или в макетном режиме.
Таким образом, модуль моделирования заканчивает тем, что-то вроде этого:
module Foo::Simulation
def break_baz!
Foo::Bar.any_instance.stub(:baz).and_raise(ArgumentError.new("You broke your baz!"))
end
end
Я пытаюсь преобразовать это использовать двойники, но я не могу понять, эквивалентный синтаксис для дублей.
Может ли кто-нибудь помочь мне с удвоениями, чтобы воспроизвести поведение any_instance.stub
?
EDIT 1
Ближайший я пришел до сих пор:
module Foo::Simulation
def break_baz!
allow(self.baz).to receive(ArgumentError.new("You broke your baz!"))
end
end
Но когда изменяется идентификатор объекта, когда я отправляю к контроллеру, этот метод больше не погасил.
EDIT 2
Это так же код, как я могу предоставить:
class Provider
include Provider::Simulation
def iam
Fog::AWS::IAM.new(credentials)
end
end
Тогда моделирование:
module Provider::Simulation
def break_server_certificates!
Fog::Mock.any_instance.stub(:upload_server_certificate).and_raise(new_error)
end
end
Спецификация:
it "should not upload a server certificate" do
provider.break_server_certificates! # provider is defined and is an instance of the Provider AR model
client.post provider_server_certificates_path, params #client is a rack client that we use to test api interactions
end
Теперь проблема в любое время изменить any_instance.stub
в моделировании использовать двойной, в partial double частичном, который ближе всего я был в состоянии получить, что-то вроде этого:
def break_server_certificates!
expect(self.iam).to receive(:upload_server_certificates).and_raise(new_error)
end
метод, но поскольку мой тест выполняет реальное взаимодействие с API, которое снова находит поставщика в контроллере, это не тот же экземпляр Provider
, поэтому, конечно, метод возвращается к умолчанию.
Я было messing с разрешением, и это может быть камень, который предоставляет метод, который я пытаюсь заглушить, который меня пугает.В любое время, когда я делаю что-то подобное, я получаю сообщение об ошибке «Класс не реализует: метод», хотя я знаю, что это так. – Eugene
Возможно, если бы вы поделились больше кода, мы могли бы видеть, что происходит? Одна вещь, чтобы следить за тем, что правый объект затушевывается. 'any_instance' удобен, потому что это повлияет на все, что возвращается через' find' на модели, - если вы хотите заменить 'any_instance', вам понадобится другой способ привязки заглушки. – zetetic
Спасибо, прости, мне потребовалось столько времени, чтобы вернуться к вам. Я отредактировал мой оригинальный вопрос, посмотрю все ниже. Редактирование 2. Любые советы, которые вы можете мне дать, будут очень благодарны. – Eugene