javascript - 如何使用 Karma 和 Jasmine 在 Angular 服务中测试 'private' 函数

标签 javascript angularjs unit-testing jasmine angular-services

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

}]);

我不仅想对返回语句中公开的函数/属性进行单元测试,而且还想对返回语句之外的函数进行单元测试。

我的测试目前设置如下:

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 函数?

谢谢!

最佳答案

无法测试这些功能。它们的范围是构成您的 BracketService 工厂的功能,它们在其他任何地方都是不可见的。如果您想测试它们,则必须以某种方式公开它们。

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

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

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

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

关于javascript - 如何使用 Karma 和 Jasmine 在 Angular 服务中测试 'private' 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013335/

相关文章:

javascript - 如何确保ajax响应是一个对象?

PHP 文件 - 使用数据库问题中的值填充动态 <select> 标记

javascript - AngularJS 指令未显示在源 HTML 中

python - 如何使这个功能更容易测试?

c# - 升级到 3.9 版后无法启动 Selenium IE 驱动程序

javascript - 从浏览器中删除地址栏(在 Android 上查看)

javascript - AngularJS ng-repeat 在单独的 View 中显示内容

angularjs - 为什么我的 AngularJS textarea 没有绑定(bind)到我的变量?

javascript - Angular JS 从数据中选择菜单,在顶部保留 1 个项目?

unit-testing - angular2 测试,如何模拟子组件