我有像
这样的方法def my_method
MyClass.new.track(arg1, arg2)
if satisfies_some_condition
2.times { MyClass.new.track(arg3, arg4) }
end
end
在RSpec
中,我想测试#track
expect_any_instance_of(MyClass).to receive(:track).with(arg1, arg2)
expect_any_instance_of(MyClass).to receive(:track).with(arg3, arg4).twice
但我收到此错误
消息'跟踪'是
收到#<MyClass:70362069595680 >
收到的,但有 已被#<MyClass:0x007ffce788e460>
似乎here它建议通过升级到RSpec-mocks v3.6.0
来解决这个问题但是即使将RSpec-mocks gem
升级为{{1}后我仍然会遇到同样的错误}}
答案 0 :(得分:0)
我从来没有喜欢any_instance
所以不确定如何用它做你想要的东西,然而,一个可能做你想要的东西的替代方案就像是
class MyClass
def track(a, b)
end
end
def my_method(pass = true)
MyClass.new.track('a', 'b')
if pass
2.times { MyClass.new.track('c', 'd') }
end
end
RSpec.describe "SO question" do
it 'pass' do
first = double(MyClass)
expect(first).to receive(:track).with('a', 'b')
second = double(MyClass)
expect(second).to receive(:track).with('c', 'd').twice
allow(MyClass).to receive(:new).and_return(first, second)
my_method
end
it 'fail' do
first = double(MyClass)
expect(first).to receive(:track).with('a', 'b')
second = double(MyClass)
expect(second).to receive(:track).with('c', 'd').twice
allow(MyClass).to receive(:new).and_return(first, second)
my_method(false)
end
end
更加冗长,但强制new
方法返回多个对它们有期望的实例。 and_return
将在每次调用时按顺序返回这些值,然后将继续返回任何其他调用的最后一个值。