Как протестировать объект, содержащий массив, используя jest

#javascript #typescript #jestjs

#javascript #typescript #jestjs

Вопрос:

Я пытаюсь протестировать объект, который содержит несколько сложных полей:

  1. одно из полей содержит массив объектов.
  2. одно из полей содержит объект, который в одном из своих полей содержит массив объектов.

Я пытался использовать expect(createdRequest).toEqual(expect.objectContaining(originRequestData)); . Я также пытался использовать expect().toMatchObject() и еще множество методов, но ни один из них не сработал.

Это интерфейс объекта, который я хочу протестировать:

 export interface IRequest {
  id?: string;
  openDate?: Date;
  closeDate: Date;
  approvals:
  {
    replyUser: Types.ObjectId;
    answer: number | null;
  }[]; // Array of objects
  target: {
    recordId?: Types.ObjectId;
    collectionName: string;
  };
  action: {
    actionType: ActionType;
    additionalData: AdditonalDataType[]; // Array of objects. note: AdditonalDataType  
                                         // is an interface of object.
  };
  comment?: string;
  requester: Types.ObjectId;
}
  

Макет, который я использую:

 export const validRequest: IRequest = {
  closeDate: new Date('12/10/2030'),
  approvals: [{
    replyUser: new Types.ObjectId(),
    answer: 2,
  }],
  target: {
    recordId: Types.ObjectId(),
    collectionName: 'occupations',
  },
  action: {
    actionType: ActionType.create,
    additionalData: [{
      field: 'job',
      value: 'chef',
    }],
  },
  requester: new Types.ObjectId(),
};
  

Тест, который я написал:

 test('Should create a single request', async () => {
  const createdRequest: IRequest = await RequestsManager.create(validRequest);
  expect(createdRequest).toEqual(expect.objectContaining(validRequest));
});
  

Ошибка, которую я получил:
введите описание изображения здесь

Комментарии:

1. вы пробовали jestjs.io/docs/en/expect#custom-matchers-api ?

2. Вы могли бы попробовать сравнить JSON.stringify() результат обоих из них.

3. Это можно решить с помощью пользовательского сопоставления jest, но я хочу найти более простое решение. Это звучит как базовое требование, поэтому для меня странно, что пользовательский сопоставитель является единственным решением. @Itamar

4. Я не могу, потому что объекты не совпадают — ‘createdRequest’ содержит больше полей, чем ‘validRequest’. Мой тест должен проверять, содержит ли createdRequest действительный запрос @Taplar

5. Решение без пользовательского сопоставления состоит в том, чтобы написать ожидаемый объект специально для утверждения, approvals: [expect.objectContaining({ replyUser: new Types.ObjectId(), answer: 2, })] и так далее.