当前位置: 首页 > 面试题库 >

如何使用Karma和Jasmine在角度服务中测试“私有”功能

郑旭
2023-03-14
问题内容

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

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语句未公开的compare,filter和createBrackets函数?

谢谢!


问题答案:

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

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

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

当我有许多可以直接进行单独测试的帮助程序功能,但打开组合的Pandora盒进行黑盒测试时,可以这样做。我通常在这些函数前加上“
_”作为前缀,以表明它们是辅助函数,并且仅用于测试。

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


 类似资料:
  • 问题内容: 我只想在不引导Angular的情况下测试服务。 我看了一些例子和教程,但是我什么也不会去。 我只有三个文件: myService.js:在这里定义AngularJS服务 test_myService.js:在这里定义服务的Jasmine测试。 specRunner.html:一个具有常规茉莉花配置的HTML文件,在其中导入了前两个其他文件以及茉莉花,Angularjs和angular-

  • 问题内容: 我正在努力使用Karma + Jasmine测试AngularJS工厂。 我无法将工厂注入变量。 我究竟做错了什么? 注意:文件已正确加载 厂: 码: 输出: 问题答案: 您需要致电:

  • 问题内容: 我刚刚跳到另一个项目,并且基本上,我被要求编写单元测试。因为我已经了解Protractor的e2e测试,所以我现在切换到Karma和Jasmine进行单元测试。我已经下载了业力,茉莉花,业力茉莉花和业力铬发射器。我也安装了角angular,所以应该准备开始了。我已经在互联网上阅读了很多东西,但是现在,我真正需要的是一个真实应用程序的具体示例,以弄清楚如何开始编写测试。我不需要简单的示例

  • 问题内容: 我正在尝试测试AngularJS服务,但似乎不起作用。 谁能解释为什么响应为空? 问题答案: 试试这个: 请求返回的响应对象在属性(docs)中具有响应数据。

  • 问题内容: 如何使用AngularJS / karma / jasmine测试来测试API后端? 我试图创建显示我的错误的最小测试用例: echo_server.py 测试/单位/apiSpec.js 输出 问题答案: 提到的测试堆栈不适用于这种方式。由于该请求已装饰在您原始请求的顶部,因此该请求永远不会被分派。 要允许请求通过,您要么需要排除,要么指定某些网址应像这样通过: 在此处阅读文档 另外

  • 本文向大家介绍使用Jasmine和Karma对AngularJS页面程序进行测试,包括了使用Jasmine和Karma对AngularJS页面程序进行测试的使用技巧和注意事项,需要的朋友参考一下 AngularJS是继jQuery之后发生在JavaScript上最好的东西。这也是JavaScript开发一直以来想要的方式。Angular主要的优点之一就是它的依赖注入(Dependency Inje