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