unitarios unitarias test pruebas karma javascript angularjs unit-testing jasmine angular-services

javascript - unitarias - Cómo probar funciones ''privadas'' en un servicio angular con Karma y Jasmine



test service angular 4 (3)

Tengo un servicio en mi aplicación angular que se parece a esto:

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; } }; }]);

Quisiera unidad de prueba no sólo las funciones / propiedades que se exponen en la sentencia de retorno, sino también las funciones que se encuentran fuera de la instrucción de retorno.

Mi prueba está configurada actualmente algo como esto:

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); })); });

Pero, ¿cómo pruebo las funciones de comparación, filtro y creación de correas que no están expuestas por la declaración de retorno?

¡Gracias!


La única manera de probarlos en su configuración actual es probar la función devuelta ya que son actualmente local al alcance dentro de la BracketService . Si usted quiere que sean comprobables de forma individual, que necesita para exponerlos en la instrucción de retorno como propiedades de BracketService .


No hay manera de probar esas funciones. Su alcance es la función que comprende su fábrica de BracketService y son invisibles en cualquier otro lugar. Si quieres probarlos, entonces tienes que exponerlos de alguna manera.

Puede moverlos a su propio servicio (que parece un exceso) o puede probar cuadro negro su servicio BracketService con suficientes combinaciones de datos para asegurarse de que las funciones internas están trabajando. Ese es probablemente el enfoque más sensato.

Si no quiere ponerlas en un servicio independiente, pero todavía se siente la necesidad de probar las funciones internas, simplemente devolverlos desde la fábrica junto con returnBrackets.

Yo podría hacer esto cuando tengo un número de funciones auxiliares que son rectas hacia adelante para probar de forma individual, sino abrir una caja de Pandora combinatoria a prueba de recuadro negro. Por lo general, prólogo estas funciones con una "_" para mostrar que son funciones de ayuda y solo están expuestas para la prueba.

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


No podrá llamar a esas funciones sin exponerlas de alguna manera. Pero, en mi humilde opinión, los métodos privados no deben tener una prueba de unidad per se, pero se probó en el momento en que el método público que les llama se pone a prueba. Lo que debe hacer es burlarse de los objetos que recibirá su función privada y podrá realizar expectativas en ellos.