Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在if语句中调用函数时的Jasmine测试用例_Javascript_Angularjs_Unit Testing_Jasmine_Karma Jasmine - Fatal编程技术网

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

Javascript 在if语句中调用函数时的Jasmine测试用例,javascript,angularjs,unit-testing,jasmine,karma-jasmine,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;

我有一个功能:

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

如果不更改代码,就不可能模仿该方法

我认为如果你能监视一个私人函数,那将是一个糟糕的测试。通常,您的测试不能知道函数的内部实现,因为如果您更改了内部,则必须更改测试。这是个坏习惯。在您的情况下,您应该像测试黑盒一样测试函数
getNames
,方法是设置
$scope.names
,并在调用后检查
$scope.fundNames
的结果


但是您可以将checkAttr函数移到外部,并监视它以实现您的测试用例。

如果不更改代码,就不可能模拟该方法

我认为如果你能监视一个私人函数,那将是一个糟糕的测试。通常,您的测试不能知道函数的内部实现,因为如果您更改了内部,则必须更改测试。这是个坏习惯。在您的情况下,您应该像测试黑盒一样测试函数
getNames
,方法是设置
$scope.names
,并在调用后检查
$scope.fundNames
的结果


但您可以将
checkAttr
函数移到外部,并对其进行间谍操作,以实现您的测试用例。

您只能使用
spyOn
函数,这些函数作为您有权访问的对象上的方法公开。例如,如果
myObj.myFunc
是一个函数,我可以将它作为
spyOn(myObj,'myFunc')
监视。由于checkAttr在
getNames
中是私有的,因此您无法直接访问它。正如@anied所说,您无法监视私有的方法。你能给我们多一点代码吗?如何准确地使用
getNames
?它是否会变成
$scope.getNames
您只能
spyOn
函数,这些函数在您有权访问的对象上作为方法公开。例如,如果
myObj.myFunc
是一个函数,我可以将它作为
spyOn(myObj,'myFunc')
监视。由于checkAttr在
getNames
中是私有的,因此您无法直接访问它。正如@anied所说,您无法监视私有的方法。你能给我们多一点代码吗?如何准确地使用
getNames
?它会变成
$scope.getNames
it('should check the name and id to remove duplicates', function() {
   //do something here
});