for循环中的函数未被测试

Ale*_*lex 11 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 = [];
  }
Run Code Online (Sandbox Code Playgroud)

我试着测试它像:

it('should have cleared copyArray on function call', function(){

    var ctrl = $componentController('copy', null);

    spyOn(ctrl, 'clearArray').and.callThrough();
    spyOn(ctrl, 'styleIcon').and.callThrough();

    ctrl.copyArray = [123];
    ctrl.clearArray();

    expect(ctrl.clearArray).toHaveBeenCalled();
    // expect(ctrl.styleIcon).toHaveBeenCalled();
    expect(ctrl.copyObjArray).toEqual([]);
    expect(ctrl.copyArray).toEqual([]);
  });
Run Code Online (Sandbox Code Playgroud)

如果我取消注释上述内容,我会收到错误,并且我的覆盖率报告中从未涵盖过vm.styleIcon调用.通过将copyArray设置为包含数组中的值,我认为for循环将在运行测试时触发.情况似乎并非如此.

谢谢.

Dan*_*mps 0

循环的代码看起来不错,所以我认为该属性vm.copyArray可能根本没有设置。如果加上一个console.log(vm.copyArray),结果是什么?

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

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

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

//test
ctrl.clearArray([123]);
Run Code Online (Sandbox Code Playgroud)