RSpec: частный метод

Я пытаюсь проверить класс с RSpec2, который имеет некоторые частные методы, которые вызываются из некоторых общедоступных методов. Я тестирую публичные методы с помощью

@foo.should_receive(:start_training).exactly(2).times

если они вызываются и как часто. Моя проблема заключается в том, что этот подход не работает с частными методами. Итак, есть ли способ использовать sth как @foo.send(:private_method) в сочетании с should_receive? Или любой другой синтаксис?

Ответ 1

should_receive (: method) работает ли: метод является общедоступным или закрытым...

Ответ 2

Вы можете использовать метод allow_any_instance_of для заглушения или издевательства над любым экземпляром класса например. у вас есть class с именем Foo с некоторыми методами private, чем вы можете сделать что-то вроде этого

allow_any_instance_of(Foo).to receive(:private_method) do
  #do something
end 

Если у вас есть module, вы можете сделать что-то вроде этого

allow_any_instance_of(Module::Foo).to receive(:private_method) do
  #do something
end

Более подробную информацию о методе allow_any_instance_of() можно найти в Официальная документация

Ответ 3

Почему вы хотите протестировать частные методы? Они частные по причине; для предотвращения доступа к внешним вызовам. Тестирование общедоступных методов, которые полагаются на частные методы, должно быть достаточным.

Ответ 4

Плохая новость: вы не можете заглушить приватный метод

хороший вариант: вы можете сделать свой метод protected, а затем заглушить его обычным способом

allow_any_instance_of(described_class).to receive(:my_protected_method_name).and_return("foo_bar")