Невозможно охватить код асинхронной функцией в 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
}))
Другие вопросы по тегам