Rspec any_instance.stub为nil引发未定义的方法`any_instance_recorder_for’:NilClassexception
这是我正在测试的类,包含在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 ' Finished in 0 seconds 1 example, 1 failure Failed examples: rspec ./Foo_spec.rb:9 # Foo Should pass this
我已经咨询过doc ,给出的例子就是传递给我的机器(所以这对rspec代码来说不是问题),但它没有给我任何关于我可能做错的信息。 错误消息也很混乱,因为它告诉我不要在nil:NilClass
上调用.any_instance
nil:NilClass
,但正如我在输出中certificate的那样, Foo
不是nil
。 我怎么.any_instance.stub
在我的自定义对象上调用.any_instance.stub
?
我正在使用Ruby 1.9.3
和rspec 2.14.5
。
您应该使用before(:each)
进行存根。
不支持
before(:all)
中的存根。 原因是在每个示例之后都清除了所有存根和模拟,因此before(:all)
设置的任何存根将在第一个在该组中运行的示例中工作,但不会在其他任何示例中运行。
rspec-mocks自述文件
从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
更新rspec
对我rspec
。 您可以使用以下命令执行此操作:
bundle update rspec