2015-06-23 46 views
27

我在角的应用程序有一个服务的角度服务,它看起来是这样的:如何测试“私人”的功能与噶和茉莉花

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

}]); 

我想单元测试不仅仅是功能/在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); 
    })); 
}); 

但我怎么测试未通过return语句暴露的比较,筛选和createBrackets功能?

谢谢!

回答

29

有没有办法来测试这些功能。它们的范围是由BracketService工厂组成的功能,而且它们在其他地方是不可见的。如果你想测试它们,那么你必须以某种方式暴露它们。

你可以将它们移动到自己的服务(这似乎有点小题大做),或者你可以黑盒测试有足够的数据组合您的BracketService服务,以确保内部功能正在工作。这可能是最明智的做法。

如果你不想把它们放在一个单独的服务,但还是觉得有必要测试这些内部功能,只是从工厂返回他们returnBrackets一起。

我可能做到这一点时,我有一些辅助函数是直截了当地单独测试,但打通一个组合潘多拉的盒子黑箱测试。我通常在前面加上一个“_”来表示这些函数是辅助函数,并且仅用于测试。

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

如果不以某种方式暴露它们,您将无法调用这些函数。但是,恕我直言,私有方法不应该持有单元测试,而是在测试调用它们的公共方法时进行测试。你应该做的是模拟你的私人功能将会收到的对象,并且你将能够对它们执行期望。

3

,以测试他们在您的当前设置的唯一方法是测试返回的功能,因为他们是目前当地的BracketService内的范围。如果您希望它们可单独测试,则需要将它们作为BracketService的属性在return语句中公开。