2015-06-23 23 views
27

Ho un servizio nella mia app angolare che sembra qualcosa di simile:Come testare le funzioni di 'privati' in un servizio di angolare con il Karma e Jasmine

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

}]); 

Vorrei unità di prova non solo le funzioni/proprietà che sono esposte nell'istruzione return, ma anche le funzioni che sono al di fuori dell'istruzione return.

Il mio test è attualmente impostato qualcosa di simile:

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

Ma come faccio a testare le confrontare, filtra e createBrackets funzioni che non sono esposti dalla dichiarazione di ritorno?

Grazie!

risposta

29

Non esiste alcun modo per testare tali funzioni. Il loro scopo è la funzione che comprende la tua fabbrica BracketService e sono invisibili altrove. Se vuoi metterli alla prova, devi esporli in qualche modo.

È possibile spostarli nel proprio servizio (che sembra eccessivo) oppure è possibile testare il proprio servizio BracketService con una combinazione di dati sufficiente per assicurarsi che le funzioni interne funzionino. Questo è probabilmente l'approccio più sensato.

Se non si desidera metterli in un servizio separato, ma si sente ancora la necessità di testare quelle funzioni interne, è sufficiente restituirli dalla fabbrica insieme a returnBrackets.

Potrei farlo quando ho un numero di funzioni di supporto che sono semplici da testare individualmente, ma apriamo un box di Pandora combinatorio a un test di scatola nera. Di solito premo tali funzioni con un "_" per mostrare che sono funzioni di supporto e sono esposte solo per i test.

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

Non sarà possibile chiamare tali funzioni senza esporle in qualche modo. Ma, IMHO, i metodi privati ​​non dovrebbero avere un test unitario, ma essere testati nel momento in cui viene testato il metodo pubblico che li chiama. Quello che dovresti fare è prendere in giro gli oggetti che la tua funzione privata riceverà e sarai in grado di soddisfare le aspettative su di loro.

3

L'unico modo per testarli nella configurazione corrente è testare la funzione restituita poiché sono attualmente locali nell'ambito all'interno di BracketService. Se si desidera che siano testabili individualmente, è necessario esporli nella dichiarazione di reso come proprietà di BracketService.

Problemi correlati