0

我有一个项目现在正在使用 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,因此该方法当然恢复为默认值。

4

1 回答 1

0

RSpec 3 中测试替身的存根由以下材料制成allow

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

但是您也可以通过在创建测试替身时提供哈希来定义允许的方法:

foo = double("foo", baz: "baz")
于 2014-09-22T19:38:34.840 回答