У меня возникают трудности с unit test, в котором я хочу проверить обработку файла, который обычно выбирается в представлении через <input type='file'>
.
В части контроллера моего приложения AngularJS файл обрабатывается внутри события изменения ввода следующим образом:
//bind the change event of the file input and process the selected file
inputElement.on("change", function (evt) {
var fileList = evt.target.files;
var selectedFile = fileList[0];
if (selectedFile.size > 500000) {
alert('File too big!');
// ...
Я хотел бы, чтобы evt.target.files
содержал мои данные mock вместо выбранного пользователем файла в моем unit test. Я понял, что я не могу создать экземпляр объекта FileList
и File
самостоятельно, что будет соответствовать объектам, с которыми работает браузер. Поэтому я пошел с назначением mock FileList для свойства ввода files
и запускал событие изменения вручную:
describe('document upload:', function () {
var input;
beforeEach(function () {
input = angular.element("<input type='file' id='file' accept='image/*'>");
spyOn(document, 'getElementById').andReturn(input);
createController();
});
it('should check file size of the selected file', function () {
var file = {
name: "test.png",
size: 500001,
type: "image/png"
};
var fileList = {
0: file,
length: 1,
item: function (index) { return file; }
};
input.files = fileList; // assign the mock files to the input element
input.triggerHandler("change"); // trigger the change event
expect(window.alert).toHaveBeenCalledWith('File too big!');
});
К сожалению, это вызывает следующую ошибку в контроллере, которая показывает, что эта попытка потерпела неудачу, поскольку файлы вообще не были привязаны к входному элементу:
TypeError: 'undefined' не является объектом (оценка "evt.target.files" )
Я уже выяснил, что свойство input.files
только для чтения по соображениям безопасности. Поэтому я начал новый подход, отправив настраиваемое изменение, которое обеспечило бы свойство файлов, но все же безуспешно.
Короче говоря: я бы хотел узнать о рабочем решении или о лучших методах подхода к этому тестовому сценарию.