Следите за методом экземпляра с помощью Rspec

У меня есть класс с несколькими методами, например

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_a на самом деле не вызывает spy.method_b . Я пытался играть с двойными и двойными экземплярами, но теперь ужасно смущен.

Как сделать так, чтобы двойной или шпионский RSpec или другой объект экземпляра наблюдали за вызовами внутренних методов экземпляра, не заменяя их полностью? Я в некотором method_b открыт для насмешки method_b , но не могу понять, как это сделать правильно.

Всего 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

Ключевая часть заключается в том, что мы фактически создаем экземпляр MyClass чтобы мы могли использовать метод and_call_original доступный только для partial test doubles .


Есть идеи?

10000