Функция async await не вызывается с помощью шутки

Я новичок в шутках, и я пытаюсь вызвать функцию ожидания, которая возвращает обещание. Но я получаю сообщение об ошибке, например, ожидаемые вызовы 1, а полученные вызовы - 0.

Код:

public async callDataSourceCommand(dialogData: any, RecipeId: string) {

   const gridItems = await this.dataSourceService.myPromiseMethod(id, collection);

}

MockData

 public get dataSourceServiceMock(): any = {
     return {
        myPromiseMethod: function () {
            return Promise.resolve({
                id: '123',
                collection: []
              });
        }
    }
}

Набор тестов

it('1. Should execute ', async() => {
    const myDialogApp: DialogApp = TestBed.get(DialogApp);
    myDialogApp.selectedOrder = selectedOrder;
    myDialogApp.RecipeId = Recipe.__id;
    myDialogApp.callDataSourceCommand(dialogData, RecipeId);
    jest.spyOn(dataSourceServiceMock, 'myPromiseMethod');
    expect(dataSourceServiceMock.myPromiseMethod).toHaveBeenCalled();
});

После добавления комментария Шуана я все еще сталкиваюсь с проблемой, например,

console.error node_modules / zone.js / dist / zone.js: 703 Отклонение необработанного обещания: неожиданный токен o в JSON в позиции 1; Зона: ProxyZone; Задача: Promise.then; Значение: SyntaxError: Неожиданный токен o в JSON в позиции 1 в JSON.parse () в OrderManagementMultipleBatchesDialogApp. (D: \ DCS_WorkSpace \ src \ DCSPlus \ UI \ libs \ order-management \ apps \ src \ components \ order-management-multiple-batches-dialog-app \ order-management-multiple-ba tches-dialog-app.factory .ts: 102: 30)

я обновил тестовый пример

MockData

 public get dataSourceServiceMock(): any = {
     return {
        myPromiseMethod: function () {
            return Promise.resolve({
                 selectedOrder: {
                    earlierStartTime: '2/5/2020',
                   __id: 'orderId123'
                },
            batchCollection: {
                  __id: 'b1order 1',
                  masterRecipeName: 'New recipe_V1.0',
                  plannedQuantity: '3',
                  masterRecipeId: 'ns=6;s=4/ProjectData/1',
                  actualQuantity: '1',
                  description: 'batchDesc',
                }
              });
        }
    }
}

Набор тестов

it('1. Should execute ', async() => {

    const myDialogApp: DialogApp = TestBed.get(DialogApp);
    myDialogApp.selectedOrder = selectedOrder;
    myDialogApp.RecipeId = Recipe.__id;

    jest.spyOn(dataSourceServiceMock, 'myPromiseMethod');

    await myDialogApp.callDataSourceCommand(multipleBatchData, masterRecipeId);

    expect(dataSourceServiceMock.myPromiseMethod).toHaveBeenCalled();
});

person Sruthy Joseph    schedule 27.02.2020    source источник
comment
странно видеть вызов асинхронной функции - т.е. myDialogApp.callDataSourceCommand(dialogData, RecipeId);, который не ожидается - вы уверены, что знаете, как использовать async / await?   -  person Jaromanda X    schedule 27.02.2020


Ответы (1)


Как правильно написал Яроманда, вам нужно await асинхронный метод. Кроме того, вам нужно следить за методом, прежде чем действовать, а не после того, как действовать.

Вот упрощенная автономная версия вашего исходного примера, которую вы можете запустить в Jest.

class MyDialogApp {
  constructor(private dataSourceService: any) {}

  public async callDataSourceCommand() {
    await this.dataSourceService.myPromiseMethod();
  }
}

const dataSourceServiceMock = {
  myPromiseMethod: function() {
    return Promise.resolve({
      id: '123',
      collection: []
    });
  }
};

const myDialogApp = new MyDialogApp(dataSourceServiceMock);

it('1. Should execute ', async () => {
  // arrange
  jest.spyOn(dataSourceServiceMock, 'myPromiseMethod');

  // act
  await myDialogApp.callDataSourceCommand();

  // assert
  expect(dataSourceServiceMock.myPromiseMethod).toHaveBeenCalled();
});
person Shaun Luttin    schedule 27.02.2020
comment
Привет, Шуан, спасибо за ответ. я обновил ваши изменения. Тем не менее, я столкнулся с проблемой, описанной выше. Вы можете помочь мне решить эту проблему? - person Sruthy Joseph; 27.02.2020
comment
Неожиданный токен o в JSON в позиции 1; Зона: ProxyZone; Задача: Promise.then; Значение: SyntaxError: Неожиданный токен o в JSON в позиции 1 в JSON.parse () в OrderManagementMultipleBatchesDialogApp. (D: \ DCS_WorkSpace \ src \ DCSPlus \ UI \ libs \ order-management \ apps \ src \ components \ order-management-multiple-batches-dialog-app \ order-management-multiple-ba tches-dialog-app.factory .ts: 102: 30) - person Sruthy Joseph; 28.02.2020