Часто, если вам нужно протестировать рекурсию, это - запах кода;вам, вероятно, следует разделить метод на разные обязанности или что-то в этом роде.
Но иногда вам просто нужно добавить некоторые базовые проверки вашей рекурсии.Вы можете сделать это с помощью Rspec and_call_original
:
it "should recurse" do
r = Recursable.new('test')
r.should_receive(:rec).with(0).ordered.and_call_original
r.should_receive(:rec).with(7).ordered.and_call_original
r.rec(0)
end
Обычно should_receive
просто заглушает реальный метод, поэтому рекурсия не работает.При and_call_original
метод-заглушка (содержащий тестовые проверки) также будет вызывать исходную реализацию метода, которая будет выполнять рекурсию, как и ожидалось.