使用Rspec监视实例方法

问题描述 投票:0回答:1

我有一个具有多种方法的类,例如

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,但也无法弄清楚如何正确地做到这一点。

ruby rspec
1个回答
1
投票

通常,我不建议以这种方式进行测试,因为方法调用是完全内部的。记住,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方法。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.