2014-07-11 4 views
0

Я пытаюсь сделать тест для моего углового контроля. Как проверить переменную, которая находится в функции?

пример:

$scope.onFileSelect = function($files) { 
$scope.selectedFiles = []; 
$scope.progress = []; 

if ($scope.upload && $scope.upload.length > 0) { 
    for (var i = 0; i < $scope.upload.length; i++) { 
    if ($scope.upload[i] !== null) { 
     $scope.upload[i].abort(); 
    } 
    } 
} 
$scope.upload = []; 
$scope.uploadResult = []; 
$scope.selectedFiles = $files; 
$scope.dataUrls = []; 



    if ($scope.selectedFiles.length==1) { 
     for (var i = 0; i < $files.length; i++) { 
     var $file = $files[i]; 
     if (window.FileReader && $file.type.indexOf('image') > -1) { 
      var fileReader = new FileReader(); 
      fileReader.readAsDataURL($files[i]); 
      var loadFile = function(fileReader, index) { 
      fileReader.onload = function(e) { 
       $timeout(function() { 
       $scope.dataUrls[index] = e.target.result; 
       }); 
      }; 
      }(fileReader, i); 
     } 
     $scope.progress[i] = -1; 
     if ($scope.uploadRightAway) { 
      $scope.start(i); 
     } 
     } 

    } 
    else{ 
     $scope.selectedFiles = null; 
     $scope.clientmsg={}; 
     $scope.errormessageheader=""; 
     $scope.uploadErrors=""; 
     $scope.UploadSuccess=""; 
     auxArray = [""]; 
     $scope.uploadErrors =auxArray; 
     $scope.errormessageheader="Only_submit_one_file"; 
    } 
    }; 

и мой тест ...

describe('Unit: routeAssignUpload_Ctrl', function() { 

beforeEach(angular.mock.module('primaryDistributionApp')); 

var ctrl, scope; 
// inject the $controller and $rootScope services 
// in the beforeEach block 
beforeEach(inject(function($controller, $rootScope) { 
// Create a new scope that's a child of the $rootScope 
scope = $rootScope.$new(); 
// Create the controller 
ctrl = $controller('routeAssignUpload_Ctrl', { 
    $scope: scope 
}); 
})); 



it('probando funcion onFileSelect',function(){ 
expect(scope.onFileSelect).toBeDefined(); 
var onFileSelect1 = new scope.onFileSelect; 
spyOn(onFileSelect1).andCallThrough(); 
expect(scope.upload).toBeDefined(); 
}); 


}) 

результат "TypeError: 'не определено' не является объектом" (оценка «$ scope.selectedFile s. length ') Я не понимаю, почему, может ли кто-нибудь мне помочь?

ответ

1

Несколько вещей, чтобы рассмотреть.

  1. Почему вы используете ключевое слово new при попытке позвонить scope.onFileSelect? Это всего лишь метод области, вам не нужно (и, вероятно, не хочу) использовать его как метод конструктора.
  2. Вы не передаёте какую-либо переменную в scope.onFileSelect. Это означает, что переменная $files равна undefined. Затем вы назначаете его через $scope.selectedFiles = $files; и проверяете его длину (if ($scope.selectedFiles.length==1) { ... }). Как показывает ошибка, undefined не имеет length.

Я также не вижу причин, по которым вам нужно шпионить за onFileSelect - вы проверяете его поведение, и вы вызываете его напрямую; использование spyOn(..).andCallThrough является наиболее полезным, если вы хотите проверить, что некоторые другие функции вызываются в этом для вас, не прерывая его поведения. Ваш тест, вероятно, можно было бы лучше записать следующим образом (плоть, чтобы испытать более интересное поведение):

it('probando funcion onFileSelect',function(){ 
    var files = ['fileA', 'fileB']; 
    expect(scope.onFileSelect).toBeDefined(); 
    scope.onFileSelect(files); 
    expect(scope.selectedFiles).toBe(files); 
    expect(scope.upload).toBeDefined(); // or whatever 
}); 

Вопрос, который вы должны спросить себя, что поведение вы действительно хотите проверить. В настоящее время это не очень интересный тест - вы знаете, что upload определен, но вы еще ничего не знаете об этом.

+0

Спасибо, действительно я noob в JS и noobin угловатый и тестирующий, это моя специальная спецификация, и я не знаю, как сделать хороший модульный тест, я не знаю, что такое тест поведения, если вы можете вести меня, я бы оценить. Я запускаю ваш ответ, и результат «Ожидается, что null будет ['fileA', 'fileB']", это означает, что scope.selectedFiles может быть нулевым? Зачем? – Dianhuro

+0

Это потому, что я не читал ваш оригинальный код достаточно тщательно. Это вызвано следующим: 'if ($ scope.selectedFiles.length == 1) {...} else {$ scope.selectedFiles = null; ...} 'Итак, это значение null, потому что в моем примере использовался массив длиной 2 вместо длины 1. Я вижу, что вы добавляете сообщение об ошибке, если отправлено несколько файлов, что заставляет меня задаться вопросом, почему вы ожидаете массив для $ files вместо одного строкового аргумента 'filename' или аналогичного. Код, который у вас есть, будет эффективно ограничивать вас до 1, как вы, кажется, ожидаете, но не похоже на самый чистый маршрут. – bloveridge

Смежные вопросы