我有一个包含多种方法的类,例如
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 不会将方法调用传递给他们正在监视的对象,因此 spy.method_a
实际上不会调用 spy.method_b
。我尝试过使用 double 和实例 double ,但现在非常困惑。
如何让 RSpec double 或 spy 或其他实例对象观察实例的内部方法调用而不完全替换它们?我愿意以某种方式模拟 method_b
,但也不知道如何正确地做到这一点。
最佳答案
通常我不建议以这种方式测试事情,因为方法调用完全是内部的事情。请记住,RSpec 是BDD 框架,而 BDD 与内部事物无关。
但是,我知道有时我们想使用模拟和 stub 来测试内部事物。因此,这是一个示例代码:
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
关键部分是我们实际上实例化MyClass
,以便我们可以使用 and_call_original
方法仅适用于 partial test doubles
.
关于ruby - 使用 Rspec 监视实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60859122/