我有一个打开文件选择器,获取文件并为该文件返回承诺的服务,以便我可以将其进一步链接(例如上传文件)。
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回调到回调中,但是由于某些原因它无法解析文件。