Невозможно охватить код асинхронной функцией в Angualr и Jest: Ожидаемое количество вызовов:> = 1 Полученное количество вызовов: 0
У меня есть асинхронный метод, в котором я вызываю 2 других метода, возвращающих обещание. Я издеваюсьuploadData
а также addOrEdit
чтобы вернуть выполненное обещание. Когда я звонюuploadFile
, и то и другое uploadData
а также addOrEdit
методы охватываются, но ожидание, которое говорит addOrEdit
были названы неудачниками. Я использую Angular 9 с Jest.
Вот код:
Тестируемый метод:
async uploadFile(): Promise<void> {
let uploadedLeis: Lei[] = [];
this.onNoClick(); // closeing the upload dialog
try {
const { leis, errors } = await this._fileService.uploadData(
this.files[0],
);
try {
uploadedLeis = await this._lei.addOrEdit(leis);
if (!this._util.isEmpty(uploadedLeis)) {
this._lei.updateLocalData(uploadedLeis);
if (this._util.isEmpty(errors)) {
this._notification.notifySuccess(
`File was successfully uploaded with ${uploadedLeis.length} LEI(s)`,
);
} else {
this._notification.notifySuccess(
`File was successfully uploaded with ${uploadedLeis.length} LEI(s).\nThere were ${errors.length} errors in the file`,
'View Errors',
);
}
} else {
this._notification.notifyError(`No records were updated`);
}
} catch (err) {
this._notification.notifyError(
`Sorry!! Failed to update records from the file`,
err,
);
}
} catch (err) {
this._notification.notifyError(
`Sorry!! Problem occured while reading the file\n${err.error}`,
err,
);
} finally {
this.files = [];
}
}
прецедент
it(`test description`, fakeAsync(() => {
const spy1 = jest.spyOn(component, 'onNoClick');
const spy2 = jest.spyOn(fileService, 'uploadData').mockResolvedValue({
leis: [],
errors: [],
});
const spy3 = jest.spyOn(leiService, "addOrEdit").mockResolvedValue({});
component.fileUploaded = true;
component.files = event;
fixture.detectChanges();
component.uploadFile();
flush();
expect(spy1).toBeCalled(); // passes
expect(spy2).toBeCalled(); // passes
expect(spy3).toBeCalled(); // fails
}));
1 ответ
Попробуйте использовать tick
или flushMicrotasks
чтобы выполнить обещания, прежде чем продолжать свои утверждения. я думаюflush()
только время вперед, а не обещания. Возможно, удастся заменить всеflushMicrotasks
с просто tick
но я не уверен.
Что-то вроде этого:
import { flushMicrotasks } from '@angular/core/testing';
it(`test description`, fakeAsync(() => {
const spy1 = jest.spyOn(component, 'onNoClick');
const spy2 = jest.spyOn(fileService, 'uploadData').mockResolvedValue({
leis: [],
errors: [],
});
const spy3 = jest.spyOn(leiService, "addOrEdit").mockResolvedValue({});
component.fileUploaded = true;
component.files = event;
fixture.detectChanges();
component.uploadFile();
flushMicrotasks();
expect(spy1).toBeCalled(); // passes
flushMicrotasks();
expect(spy2).toBeCalled(); // passes
flushMicrotasks();
expect(spy3).toBeCalled(); // fails
}))