Функция внутри цикла for не тестируется

У меня есть функция im, пытающаяся проверить:

  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 будет запускаться при запуске теста. Кажется, это не так.

Благодарю.

Ответ 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];

не меняет его значения.

В любом случае, без кода, трудно получить то, что вызывает ошибку.

Ответ 2

Код цикла выглядит хорошо, поэтому я думаю, что свойство vm.copyArray не может быть установлено вообще. Если вы добавите console.log(vm.copyArray), каков результат?

Возможно, vm и $componentController('copy', null) не являются ссылками на один и тот же объект, а вызовы друг друга через некоторую библиотеку? есть ли другой способ ссылаться на vm из тестового скрипта, а не на использование $componentController('copy', null)?

Ваш цикл должен запускаться, когда вы передаете массив в функции в качестве аргумента. Конечно, ваш код на самом деле завершится неудачей, если только pass vm.copyArray не 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]);

Ответ 3

Трудно определить точную причину, потому что вы показали образец, взятый прямо из вашего теста, а не минимальный, полный и проверяемый пример. Кроме того, вы не указали, какие ошибки или expect результаты, поэтому мы удаляем очень ограниченную информацию.

Тем не менее, я сильно подозреваю, что vm не определено /null или не является прототипом, доступным для запуска через $componentController. Если это так, вы должны получить сообщение об ошибке в spyOn(ctrl, 'clearArray').and.callThrough() или ctrl.clearArray(), никогда не запуская цикл и, таким образом, никогда не вызывая vm.styleIcon. В этом случае вам нужно проверить, что ctrl - это фактически экземпляр любого прототипа vm являющегося частью (на самом деле это глобальная переменная?).

Если это не так, и оба прототипа vm верны и $componentController('copy', null); создает объект, который, по вашему мнению, есть, возможно, styleIcon undefined/null, не может быть вызван и создает по существу ту же проблему. В этом случае убедитесь, что styleIcon установлен и что он является функцией, которую вы так считаете.

Когда все остальное терпит неудачу, отладчики - ваш друг.

Пожалуйста, укажите, что такое ошибка (-ы) и где они происходят (более подробно) для лучшего ответа.