Следите за методом экземпляра с помощью Rspec - PullRequest
0 голосов
/ 26 марта 2020

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

class MyClass
  def method_a(p)
    method_b if p == 1
  end

  def method_b
    some_more_stuff
  end
end

И я могу sh проверить, используя RSpe c, что 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

К сожалению, поскольку шпионы RSpe c не передают вызовы методов тому, на кого они шпионят, spy.method_a на самом деле не вызывает spy.method_b. Я пытался играть с двойными и двойными экземплярами, но теперь ужасно смущен.

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

1 Ответ

1 голос
/ 27 марта 2020

Как правило, я не рекомендую тестировать подобные вещи, поскольку вызов метода является полностью внутренним. Помните, что RSpe c - это BDD framework, а 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.

...