Как проверить функции '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?
Спасибо!
Ответы
Ответ 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
.