2013-02-20 1 views
7

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

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

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

ответ

10

should_receive (Метод) работает ли: метод является публичным или частным ...

+1

eehmm ... Я уверен, что он работает. Можете ли вы объяснить это больше, что вы имеете в виду? – 23tux

+0

Я пробовал это, когда я пытаюсь вызвать should_receive с помощью частного метода, я получаю 'private method' start_training ', вызываемый для # ' – 23tux

+0

Не могли бы вы разместить еще немного кода? В спецификации я работаю над atm, я должен_receive'ing частные методы без проблем ... –

0

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

+6

Я уверен, что это стоит того, чтобы проверять частные методы. В противном случае, если у вас есть 10 общедоступных методов, которые полагаются на этот частный метод, вы можете в конечном итоге повторить себя, проверяя поведение всех публичных этих методов. –

+1

@ AndréHerculano да, но вы должны испытывать поведение, а не реализацию. Вы будете проверять возврат этих публичных методов, независимо от того, какие частные методы они используют. –

5

Вы можете использовать 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() метод на Official Documentation