Как выполнить модульное тестирование службы выбора файлов, которая зависит от изменения jquery, возвращает обещание файла? - PullRequest
0 голосов
/ 16 января 2019

У меня есть служба, которая открывает средство выбора файлов, получает файл и возвращает обещание для этого файла, чтобы я мог связать его дальше (например, загрузить файл).

public pickAttachment(): ng.IPromise<File> {
    return this.$q((resolve, reject) => {
        let input = $("input.attachment-picker");
        input.click();

        input.change((e: Event) => this.getFile(e, resolve, reject));
    });
}

public getFile(e: Event, resolve: Function, reject: Function): void {
    const file: File = (<HTMLInputElement>e.target).files[0];
    if (file) {
        resolve(file);
    } else {
        reject("no file selected");
    }
}

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

beforeEach(() => {
    angular.mock.module("...");

    angular.mock.inject((attachmentsService,
                         $q) => {
        this.described = attachmentsService;
        this.$q = $q;
    });

    this.selectedFile = {
        name: "Owl.gif",
        size: 123456
    }

    this.fileList  = [this.selectedFile];
});

describe(".pickAttachment()", () => {
    beforeEach(() => {
        const fakeEvent = {
            type: "change",
            target: {
                files: this.fileList
            }
        }

        appendSetFixtures("<input class='attachment-picker'/>");
        });
    });

    it("returns a promise of the selected file", () => {
     expect(this.described.pickAttachment()).toEqual(this.$q.when(this.selectedFile));
    });
});

Я не совсем уверен, как заставить это событие изменения сработать в pickAttachment(), чтобы я мог ожидать обещание для этого файла. В противном случае он просто получает пустое обещание. Как я могу заставить его вернуть обещание с файлом?

edit: я пытался поместить spyOn в $.fn.change и callFake для обратного вызова, используя здесь событие fake, но по какой-то причине файл не разрешается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...