2014-09-22 1 views
0

У меня есть проект, который теперь использует 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, поэтому, конечно, метод возвращается к умолчанию.

ответ

0

Заглушки для испытания двойников в RSpec 3 выполнены с allow:

foo = double("foo") 
allow(foo).to receive(:baz) { "baz" } 

Но вы также можете определить разрешенные методы, с помощью питающих хэша при создании теста двойной:

foo = double("foo", baz: "baz") 
+0

Я было messing с разрешением, и это может быть камень, который предоставляет метод, который я пытаюсь заглушить, который меня пугает.В любое время, когда я делаю что-то подобное, я получаю сообщение об ошибке «Класс не реализует: метод», хотя я знаю, что это так. – Eugene

+0

Возможно, если бы вы поделились больше кода, мы могли бы видеть, что происходит? Одна вещь, чтобы следить за тем, что правый объект затушевывается. 'any_instance' удобен, потому что это повлияет на все, что возвращается через' find' на модели, - если вы хотите заменить 'any_instance', вам понадобится другой способ привязки заглушки. – zetetic

+0

Спасибо, прости, мне потребовалось столько времени, чтобы вернуться к вам. Я отредактировал мой оригинальный вопрос, посмотрю все ниже. Редактирование 2. Любые советы, которые вы можете мне дать, будут очень благодарны. – Eugene

 Смежные вопросы

  • Нет связанных вопросов^_^