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
在函数中作为参数传递数组时,必须触发循环。当然,除非将passvm.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];