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