Rspec any_instance.stub为nil引发未定义的方法`any_instance_recorder_for':NilClass异常

时间:2013-09-11 11:33:46

标签: ruby rspec

以下是我正在测试的课程 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

我已经咨询了the doc,给出的例子是传递我的机器(所以它不是rspec代码的问题),但它没有给我任何关于我可能在做什么的信息错误。错误消息也很混乱,因为它告诉我不要在.any_instance上拨打nil:NilClass,但正如我在输出中证明的那样,Foo不是nil。我该如何在我的自定义对象上调用.any_instance.stub

我正在使用Ruby 1.9.3和rspec 2.14.5

3 个答案:

答案 0 :(得分:27)

您应该使用before(:each)进行存根。

  

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

rspec-mocks readme

答案 1 :(得分:6)

从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

答案 2 :(得分:0)

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

bundle update rspec