Частный метод Единичное тестирование с использованием жасмина

Я использовал кодирование тестовых примеров для приложения 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'} передает аргумент объекта.