12

这是我正在测试的包含在Foo.rb中的类:

class Foo
    def bar
        return 2
    end
end

这是Foo_spec.rb中包含的我的测试:

require "./Foo.rb"

describe "Foo" do
    before(:all) do
        puts "#{Foo == nil}"
        Foo.any_instance.stub(:bar).and_return(1)
    end

    it "should pass this" do
        f = Foo.new
        f.bar.should eq 1
    end
end

我得到以下输出:

false
F

Failures:

  1) Foo Should pass this
     Failure/Error: Foo.any_instance.stub(:bar).and_return(1)
     NoMethodError:
       undefined method `any_instance_recorder_for' for nil:NilClass
     # ./Foo_spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 0 seconds
1 example, 1 failure

Failed examples:

rspec ./Foo_spec.rb:9 # Foo Should pass this

我已经查阅了文档,给出的示例正在我的机器上传递(所以它不是 rspec 代码的问题),但它没有给我任何关于我可能做错了什么的信息。错误消息也很令人困惑,因为它告诉我不要调用.any_instancea nil:NilClass,但正如我用我的输出证明的那样,Foois not nil。我应该如何调用.any_instance.stub我的自定义对象?

我正在使用 Ruby1.9.3和 rspec 2.14.5

4

3 回答 3

28

您应该before(:each)用于存根。

before(:all)不支持存根。原因是所有存根和模拟在每个示例之后都会被清除,因此设置的任何存根都before(:all)可以在恰好在该组中运行的第一个示例中工作,但不适用于其他任何示例。

rspec-mocks 自述文件

于 2013-09-12T00:12:08.053 回答
10

从 Rspec 3 开始,不再定义 any_instance。

现在使用:

allow_any_instance_of(Foo).to receive(:bar).and_return(1)

此版本和旧版本的来源: https ://makandracards.com/makandra/2561-stub-methods-on-any-instance-of-a-class-in-rspec-1-and-rspec-2

于 2017-02-08T12:02:10.873 回答
0

更新rspec对我有用。您可以使用以下命令执行此操作:

bundle update rspec

于 2013-09-11T12:10:38.277 回答