Javascript 未测试的for循环内部的功能

Javascript 未测试的for循环内部的功能,javascript,unit-testing,karma-jasmine,Javascript,Unit Testing,Karma Jasmine,我有一个功能正在尝试测试: vm.clearArray = function(){ for (var id=0; id<vm.copyArray.length;id++){ vm.styleIcon(vm.copyArray[id],'black') } vm.copyObjArray = []; vm.copyArray = []; } 如果我取消对上述内容的注释,我会得到一个错误,vm.styleIcon调用永远不会包含在我的覆盖率

我有一个功能正在尝试测试:

  vm.clearArray = function(){
    for (var id=0; id<vm.copyArray.length;id++){
      vm.styleIcon(vm.copyArray[id],'black')
    }
    vm.copyObjArray = [];
    vm.copyArray = [];
  }
如果我取消对上述内容的注释,我会得到一个错误,vm.styleIcon调用永远不会包含在我的覆盖率报告中。通过将copyArray设置为在数组中包含一个值,我认为在运行测试时会触发for循环。情况似乎并非如此


谢谢。

循环的代码看起来不错,因此我认为可能根本没有设置属性
vm.copyArray
。如果添加
console.log(vm.copyArray)
,结果是什么

也许vm和
$componentController('copy',null)
不是对同一对象的引用,而是通过某个库调用彼此的函数?除了使用
$componentController('copy',null)
,还有其他方法从测试脚本中引用
vm

在函数中作为参数传递数组时,必须触发循环。当然,除非将pass
vm.copyArray
作为实际代码中的参数,否则您的实际代码将失败,但它将显示循环是否是问题所在,或者测试脚本中对vm的引用:

//tested function
 vm.clearArray = function(copyArray){
    for (var id=0; id<copyArray.length;id++){
      vm.styleIcon(copyArray[id],'black')
    }
  }

//test
ctrl.clearArray([123]);
//已测试的函数
vm.clearArray=函数(copyArray){

对于(var id=0;id,很难确定确切原因,因为您显示的是直接从测试中获取的样本,而不是a。此外,您没有指定错误或
预期的结果是什么,因此我们提供的信息非常有限

也就是说,我强烈怀疑
vm
是未定义的/null,或者不是可通过
$componentController
实例化的原型。如果是这种情况,您应该在
spyOn(ctrl,'clearArray')。和.callThrough()
ctrl.clearArray()处收到错误
,从不运行循环,因此从不调用
vm.styleIcon
。在这种情况下,您需要验证
ctrl
实际上是
vm
所属的任何原型的实例(它实际上是全局变量吗?)

如果情况并非如此,且
vm
原型正确且
$componentController('copy',null);
正在创建您认为它是的对象,可能
样式图标
未定义/null,无法调用,并且创建了本质上相同的问题。在这种情况下,请确保设置了
样式图标
,并且它是您认为它是的函数

当一切都失败时,调试器就是你的朋友


请详细说明错误是什么以及发生在哪里(更详细),以获得更好的答案。

我相信是某种继承方案导致了您的错误。我的假设是您的控制器由基本控制器扩展

根据我看到的少数代码,我可以做出两个假设:

1) clearArray()在子控制器中被重写

vm.clearArray = function(){
    ...
    vm.copyArray = [];
}
因此,您试图测试错误的clearArray()

2) ctrl.copyArray由于实现继承的方式而不可写,例如

function ParentController() {
    var vm = this;
    vm.copyArray = [];
    vm.copyObjArray = [];
    vm.clearArray = function() {
        for (var id=0; id<vm.copyArray.length;id++){
            vm.styleIcon(vm.copyArray[id],'black')
        }
        vm.copyObjArray = [];
        vm.copyArray = [];
    }

    vm.styleIcon = function(index, color) {
    }
};

function ChildController() {
    ParentController.call(this);
}

ChildController.prototype = Object.create(ParentController.prototype, {copyArray:{ value: [] } });

var ctrl = new ChildController();
不会更改其值


无论如何,如果没有更多的代码,就很难找到导致错误的原因。

您必须
spyOn
styleIcon()
function?Yes@Pointy如果我在其中添加它,它仍然会失败。您可以设置一个断点吗?在循环中设置一个断点,并检查是否调用了该指令。我不确定,但请尝试移动ctrl.copyArray=[123];在var ctrl=$componentController('copy',null)之后移动;
function ParentController() {
    var vm = this;
    vm.copyArray = [];
    vm.copyObjArray = [];
    vm.clearArray = function() {
        for (var id=0; id<vm.copyArray.length;id++){
            vm.styleIcon(vm.copyArray[id],'black')
        }
        vm.copyObjArray = [];
        vm.copyArray = [];
    }

    vm.styleIcon = function(index, color) {
    }
};

function ChildController() {
    ParentController.call(this);
}

ChildController.prototype = Object.create(ParentController.prototype, {copyArray:{ value: [] } });

var ctrl = new ChildController();
ctrl.copyArray = [123];