Функция внутри цикла 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
установлен и что он является функцией, которую вы так считаете.
Когда все остальное терпит неудачу, отладчики - ваш друг.
Пожалуйста, укажите, что такое ошибка (-ы) и где они происходят (более подробно) для лучшего ответа.