我有我的方法
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>接收
这里似乎建议通过升级到RSpec-mocks v3.6.0来解决这个问题,但是即使在将RSpec-mocks gem升级到v3.6.0之后,我仍然会遇到同样的错误
发布于 2017-07-20 08:07:58
我从来没有喜欢过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都会按顺序返回这些值,然后继续返回任何额外调用的最后一个值。
https://stackoverflow.com/questions/45208349
复制相似问题