首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Karma和Jasmine测试angular服务中的“private”函数

如何使用Karma和Jasmine测试angular服务中的“private”函数
EN

Stack Overflow用户
提问于 2015-06-24 04:53:57
回答 3查看 26.5K关注 0票数 31

我在我的angular应用程序中有一个服务,看起来像这样:

代码语言:javascript
复制
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语句之外的函数进行单元测试。

我的测试目前是这样设置的:

代码语言:javascript
复制
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);
    }));
});

但是如何测试未被返回语句公开的compare、filter和createBrackets函数呢?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-24 04:58:05

没有办法测试这些功能。它们的作用域是组成您的BracketService工厂的函数,它们在任何其他地方都是不可见的。如果你想测试它们,那么你必须以某种方式暴露它们。

您可以将它们移动到它们自己的服务中(这似乎有点过头),或者您可以使用足够的数据组合对您的BracketService服务进行黑盒测试,以确保内部函数正常工作。这可能是最明智的方法。

如果您不想将它们放在单独的服务中,但仍然觉得需要测试这些内部函数,那么只需将它们与returnBrackets一起从工厂返回即可。

当我有许多辅助函数可以直接单独测试时,我可能会这样做,但在黑盒测试中打开一个组合的潘多拉盒子。我通常在这些函数前面加上一个"_“,以表明它们是辅助函数,并且仅公开用于测试。

代码语言:javascript
复制
return {
    //create brackets from a list of competitors
    returnBrackets: function(competitors) {...},
    _filterWeightGroup: filterWeightGroup,
    _createBracketsByWeightGroup: createBracketsByWeightGroup
   };
票数 33
EN

Stack Overflow用户

发布于 2015-06-24 05:02:59

如果不以某种方式公开这些函数,您将无法调用它们。但是,IMHO,私有方法不应该有单元测试perse,而是在测试调用它们的公共方法时进行测试。您应该做的是模拟您的私有函数将接收的对象,您将能够对它们执行期望。

票数 14
EN

Stack Overflow用户

发布于 2015-06-24 05:05:05

在当前设置中测试它们的唯一方法是测试返回的函数,因为它们当前位于BracketService内的作用域中。如果您希望它们可以单独测试,则需要在返回语句中将它们公开为BracketService的属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31013335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档