2013-07-26 3 views
12

Я был кодированием тестовых примеров для углового применения с использованием жасмина. Но многие внутренние методы объявляются частными в сервисах.Частный метод Единичное тестирование с жасмином

Пример:

App.service('productDisplay', function(){ 
    var myPrivate = function(){ 
     //do sth 
    } 
    this.doOfferCal = function(product, date){ 
     //call myPrivate 
     //do sth too 
     return offer; 
    } 
}); 

Использование жасмина это простое в код тест на «doOfferCal», но я хочу написать модульный тест для myPrivate тоже.

Как я могу это сделать?

Заранее спасибо.

+0

Возможный дубликат [Как я проверить класс, который имеет частные методы, поля или внутренние классы?] (https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

ответ

0

Для проверки внутренних функций я вызываю внешнюю функцию, которая вызывает внутреннюю функцию, а затем меняет свой вход в соответствии с тем, что требует внутренняя функция. Таким образом, в вашем случае вы бы назвали «productDisplay» и изменили свой вход на основе того, что нужно «myPrivate», а затем убедитесь, что у вас есть ожидаемый результат. Вы также можете следить за «myPrivate» и тестировать все так, используя .havebeencalledwith или .andcallthrough.

8

Есть ли конкретная причина, по которой вы хотите проверить свои личные методы?

При тестировании doOfferCal() вы неявно проверяете, что myPrivate() делает правильную вещь.

Хотя это для RailsConf, у Sandi Metz есть очень хорошая беседа на what should be tested.

+0

Мой «doOfferCal» вызывает много частных методов и, наконец, возвращает сложный результат, так как, по-моему, было бы хорошо протестировать все частные методы. Кстати, у вас есть какие-то предложения в этой ситуации? – arnold

+2

Одна школа мысли заключается в том, что частные методы - это детали реализации. Проверяя свои частные методы, ваши тесты будут прерываться, хотя ваш общедоступный метод все еще действует правильно. В результате вы можете создать тесты, которые слишком хрупкие и отпугнуть разработчиков от улучшения/реорганизации реализации. – achan

+2

Извините, я не понимал, что нажатие enter будет отправлять мое сообщение. Что бы я делал в этом случае, это test 'doOfferCal()', а затем проверить возвращаемый им сложный объект. Если этот тест проходит, все частные методы между ними работают по назначению. Я уверен, что вы найдете людей в поддержку частных методов, но это то, что я нашел, работает лучше всего для меня с точки зрения написания полезных и поддерживаемых модульных тестов. – achan

2

Ахан является 100% прав, но если вам действительно нужно вызвать частный метод в тестах (что должно быть никогда :-)) Вы можете сделать это:

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough(); 
myPrivateSpy.call(); 
Смежные вопросы