for循环中的函数未被测试

时间:2017-03-10 23:18:14

标签: 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 = [];
  }

我正试图测试它:

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([]);
  });

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

感谢。

3 个答案:

答案 0 :(得分:1)

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

从我看到的几个代码中,我可以做出两个假设:

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

使用上面的方法会产生错误,copyArray被定义为不可写的属性,所以行:

ctrl.copyArray = [123];

不会改变它的价值。

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

答案 1 :(得分:0)

循环的代码看起来不错,所以我认为可能根本没有设置属性@available(iOS 9.0, *) open class PKContact : NSObject { ... } 。如果您添加vm.copyArray,结果是什么?

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

将函数中的数组作为参数传递时,必须触发循环。当然,除非在实际代码中将$componentController('copy', null)作为参数传递,否则实际代码将失败,但它会显示循环是否存在问题,或者是否从测试脚本引用了vm:

vm.copyArray

答案 2 :(得分:0)

很难确定确切的原因,因为您已经从测试中直接看到了样本,而不是minimal, complete, and verifiable example。此外,您没有指定错误或expect结果是什么,因此我们会提供非常有限的信息。

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

如果不是这种情况且vm原型都正确且$componentController('copy', null);正在创建您认为的对象,则styleIcon未定义/ null,无法调用并创造基本相同的问题。在这种情况下,请确保styleIcon已设置,并且它是您认为的功能。

当其他所有方法都失败时,调试器就是你的朋友。

请指明错误的内容以及错误发生的位置(更详细)以获得更好的答案。