我最近在 Ruby 2.0、Rails 4 和 Rspec 2.13.1 中发现了这种特殊行为
当我使用 存根实例方法ClassName.any_instance.stub(:method_name)
时,它会正确存根和我创建的过去实例。但是,当我通过更改返回值对其进行重新存根时,旧实例返回旧的存根值,而不是新的存根值。
例如,我有这个虚拟类定义
class A
def test(x)
return x
end
end
这个测试描述了行为:
it 'strange stubbing behavior' do
inst = A.new
inst.test(1).should eq 1 #passes
A.any_instance.stub(:test).and_return(10)
inst.test(0).should eq 10
A.any_instance.unstub(:test) #has no effect
A.any_instance.stub(:test).and_return(100)
inst.test(0).should eq 100 #expects 100, got 10
A.any_instance.stub(:test) do |a|
a + 2
end
inst.test(3).should eq 5 #also fails # also got 10
end
为什么 rspec 会这样?它是定义的行为吗?如果是这样,那么重新创建旧实例的正确方法是什么。或者它是一个错误?
编辑:在其他人给出“质疑问题”的答案之前,我想指出我确实通过重新考虑规范并重新组织它们来解决我原来的问题。但是,我仍然很好奇为什么 RSpec 会这样