Частный метод Единичное тестирование с использованием жасмина
Я использовал кодирование тестовых примеров для приложения angular с использованием жасмина. Но многие внутренние методы объявляются частными в сервисах.
Пример:
App.service('productDisplay', function(){
var myPrivate = function(){
//do sth
}
this.doOfferCal = function(product, date){
//call myPrivate
//do sth too
return offer;
}
});
Использование жасмина прямо для проверки кода для "doOfferCal", но я хочу написать unit test для myPrivate тоже.
Как я могу это сделать?
Спасибо заранее.
Ответы
Ответ 1
Есть ли конкретная причина, по которой вы хотите проверить свои частные методы?
Проверяя doOfferCal()
, вы неявно проверяете, что myPrivate()
делает правильные вещи.
Хотя это для RailsConf, Sandi Metz очень хорошо говорит о что нужно протестировать.
Ответ 2
Achan на 100% прав, но если вам действительно нужно вызвать частный метод в своих тестах (что должно быть никогда:-)), вы можете сделать это:
var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough();
myPrivateSpy.call();
Ответ 3
Чтобы проверить внутренние функции, я вызываю внешнюю функцию, которая вызывает внутреннюю функцию, а затем изменяю свой ввод в соответствии с тем, что требуется внутренней функции. Таким образом, в вашем случае вы должны позвонить в productDisplay
и изменить свой вклад в зависимости от потребностей myPrivate
, а затем убедиться, что у вас есть ожидаемый результат. Вы также можете следить за myPrivate
и тестировать вещи таким же образом, используя .havebeencalledwith
или .andcallthrough
.
Ответ 4
Спасибо jabko87.
Кроме того, если вы хотите передать аргументы, используйте приведенный ниже пример:
const myPrivateSpy = spyOn<any>(service, 'transformNative').and.callThrough();
myPrivateSpy.call(service, {name: 'PR'});
Примечание. Здесь service - это Class, transformNative - это закрытый метод, а {name: 'PR'} передает аргумент объекта.