如何对依赖于jQuery更改的文件选择器服务进行单元测试,返回文件promise?

时间:2019-01-16 19:54:37

标签: javascript jquery html angularjs jasmine

我有一个打开文件选择器,获取文件并为该文件返回承诺的服务,以便我可以将其进一步链接(例如上传文件)。

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()内触发更改事件,以便让我期望对该文件的承诺。否则,它只是一个空洞的承诺。如何使它返回带有文件的承诺?

编辑:我尝试在spyOn上放置$.fn.change并在此处使用false事件将Fake回调到回调中,但是由于某些原因它无法解析文件。

0 个答案:

没有答案