Подтвердить что ты не робот

Как проверить функции 'private' в сервисе angular с кармой и жасмином

У меня есть сервис в моем приложении angular, который выглядит примерно так:

angular.module('BracketService', []).factory('BracketService', [function() {
    function compareByWeight(a, b) {
        return a.weight - b.weight;
    }
    function filterWeightGroup(competitors, lowWeight, highWeight) {
        //filter stuff
    }
    function createBracketsByWeightGroup(weightGroup) {
        //create some brackets
    }
    //set some base line values
    var SUPER_HEAVY_WEIGHT = 500;
    var SUPER_LIGHT_WEIGHT = 20;
    return {
        //create brackets from a list of competitors
        returnBrackets: function(competitors) {
            var brackets = {};
            //get super light weights
            brackets.superLightWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, 0, SUPER_LIGHT_WEIGHT)
                .sort(compareByWeight)
            );
            brackets.superHeavyWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, SUPER_HEAVY_WEIGHT, Infinity)
                .sort(compareByWeight)
            );
            brackets.middleWeights = createBracketsByWeightGroup(
                filterWeightGroup(competitors, SUPER_LIGHT_WEIGHT, SUPER_HEAVY_WEIGHT)
                .sort(compareByWeight)
            );
            return brackets;
        }
    };

}]);

Я хотел бы unit test не только функции/свойства, которые отображаются в операторе return, но также и функции, которые находятся вне оператора return.

В настоящее время мой тест настроен примерно так:

describe('BracketService', function() {
    beforeEach(module('bracketManager'));

    it('calling return brackets with no competitors will return 3 empty weight classes', inject(function(BracketService) {
        var mockCompetitors = [];
        var mockBracketResult = {superHeavyWeights: [[]], superLightWeights: [[]], middleWeights: [[]]};
        expect(BracketService.returnBrackets(mockCompetitors)).toEqual(mockBracketResult);
    }));
});

Но как я могу проверить функции сравнения, фильтрации и createBrackets, которые не отображаются оператором return?

Спасибо!

4b9b3361

Ответ 1

Невозможно проверить эти функции. Их область действия - это функция, которая содержит ваш BracketService factory, и они невидимы в любом месте. Если вы хотите их протестировать, вы должны как-то их разоблачить.

Вы можете перенести их на свой сервис (что кажется излишним), или вы можете черным ящиком проверить свою службу BracketService с достаточным количеством комбинаций данных, чтобы убедиться, что внутренние функции работают. Это, вероятно, самый разумный подход.

Если вы не хотите размещать их в отдельной службе, но все же чувствуете необходимость протестировать эти внутренние функции, просто верните их из factory вместе с returnBrackets.

Я мог бы сделать это, когда у меня есть ряд вспомогательных функций, которые прямо проверяются индивидуально, но открывают комбинаторный блок Pandora для теста черного ящика. Обычно я предваряю такие функции с помощью "_", чтобы показать, что они вспомогательные функции и доступны только для тестирования.

return {
    //create brackets from a list of competitors
    returnBrackets: function(competitors) {...},
    _filterWeightGroup: filterWeightGroup,
    _createBracketsByWeightGroup: createBracketsByWeightGroup
   };

Ответ 2

Вы не сможете вызвать эти функции, не подвергая их каким-либо образом. Но IMHO, частные методы не должны иметь unit test perse, но должны быть протестированы в то время, когда проверяется публичный метод, который их вызывает. То, что вам нужно сделать, - это высмеять объекты, которые получит ваша частная функция, и вы сможете выполнить их ожидания.

Ответ 3

Единственный способ протестировать их в вашей текущей настройке - проверить возвращаемую функцию, так как они в настоящее время локальны для области внутри BracketService. Если вы хотите, чтобы они были подвергнуты индивидуальной проверке, вам нужно выставить их в оператор return как свойства BracketService.