我有一个项目现在正在使用 RSpec 3,但仍然包含(现已弃用)用于存根方法的 RSpec 2 语法。
目前我们广泛使用:
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
吗?
编辑 1
到目前为止,我最接近的是:
module Foo::Simulation
def break_baz!
allow(self.baz).to receive(ArgumentError.new("You broke your baz!"))
end
end
但是当我发布到控制器时对象 id 发生变化时,该方法不再被存根。
编辑 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
在模拟中更改为使用双精度,特别是部分双精度,这是我能够得到的最接近的,如下所示:
def break_server_certificates!
expect(self.iam).to receive(:upload_server_certificates).and_raise(new_error)
end
该方法仍然存在,但是由于我的测试进行了真正的API交互,它再次在控制器中找到了提供者,它不是同一个实例Provider
,因此该方法当然恢复为默认值。