在if语句中调用函数时的Jasmine测试用例

时间:2017-02-28 18:36:56

标签: javascript angularjs unit-testing jasmine karma-jasmine

我有一个功能:

function getNames() {
        var ids = [];
        var checkAttr = function (array, attr, value) {
            for (var i = 0; i < array.length; i++) {
                if (array[i][attr] === value) {
                    return false;
                }
            }
            return true;
        };
        for (var i = 0; i < result.length; i++) {
            var selected = result[i];
            if (checkAttr($scope.names, "name", selected.name) && ids.indexOf(selected.id) === -1 && selected.myInfo && selected.name !== "") {
                $scope.fundNames.push({
                    name: selected.name,
                    id: selected.id
                });
                ids.push(selected.id);
            }
        }
        ...
    }

我想编写一个测试,检查我是否使用checkAttr函数检查name和id以删除重复项。但我不知道该怎么做。我尝试使用spyOn但不断出错。

我想要的内容如下:

it('should check the name and id to remove duplicates', function() {
   //do something here
});

1 个答案:

答案 0 :(得分:3)

在不更改代码的情况下模拟该方法是不可能的。

我认为如果你能窥探一个私人功能,这将是一个糟糕的考验。通常,您的测试必须不了解函数的内部实现,因为如果更改内部,则必须更改测试。这是一个不好的做法。在您的情况下,您应该通过设置getNames并在调用后检查$scope.names的结果来测试函数$scope.fundNames,如黑框。

但是你可以将checkAttr函数移到外面并使用spyOn来实现你的测试用例。