我有一个具有多种方法的类,例如
class MyClass
def method_a(p)
method_b if p == 1
end
def method_b
some_more_stuff
end
end
而且我想使用RSpec测试method_a
(有时)调用method_b
。
it 'calls method_b if the passed parameter is 1' do
instance = spy('MyClass')
instance.method_a(1)
expect(instance).to have_received(:method_b)
end
[不幸的是,由于RSpec间谍没有将方法调用传递给他们正在监视的事物,因此spy.method_a
实际上并未调用spy.method_b
。我试过玩双打和实例双打,但是现在却感到非常困惑。
我如何让RSpec double或spy或其他实例对象观察实例的内部方法调用而不完全替换它们?我愿意以某种方式模拟method_b
,但也无法弄清楚如何正确地做到这一点。
通常,我不建议以这种方式进行测试,因为方法调用是完全内部的。记住,RSpec是BDD框架,而BDD与内部事物无关。
但是,我知道有时候我们想使用模拟和存根测试内部事物。因此,这是示例代码:
RSpec.describe MyClass do
it 'calls method_b if the passed parameter is 1' do
instance = MyClass.new
expect(instance).to receive(:method_a).and_call_original
expect(instance).to receive(:method_b)
instance.method_a(1)
end
end
关键部分是我们actually实例化MyClass
,以便可以使用仅在and_call_original
上可用的and_call_original
方法。