Я пытаюсь сделать тест для моего углового контроля. Как проверить переменную, которая находится в функции?
пример:
$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 ') Я не понимаю, почему, может ли кто-нибудь мне помочь?
Спасибо, действительно я noob в JS и noobin угловатый и тестирующий, это моя специальная спецификация, и я не знаю, как сделать хороший модульный тест, я не знаю, что такое тест поведения, если вы можете вести меня, я бы оценить. Я запускаю ваш ответ, и результат «Ожидается, что null будет ['fileA', 'fileB']", это означает, что scope.selectedFiles может быть нулевым? Зачем? – Dianhuro
Это потому, что я не читал ваш оригинальный код достаточно тщательно. Это вызвано следующим: 'if ($ scope.selectedFiles.length == 1) {...} else {$ scope.selectedFiles = null; ...} 'Итак, это значение null, потому что в моем примере использовался массив длиной 2 вместо длины 1. Я вижу, что вы добавляете сообщение об ошибке, если отправлено несколько файлов, что заставляет меня задаться вопросом, почему вы ожидаете массив для $ files вместо одного строкового аргумента 'filename' или аналогичного. Код, который у вас есть, будет эффективно ограничивать вас до 1, как вы, кажется, ожидаете, но не похоже на самый чистый маршрут. – bloveridge