#javascript #typescript #jestjs
#javascript #typescript #jestjs
Вопрос:
Я пытаюсь протестировать объект, который содержит несколько сложных полей:
- одно из полей содержит массив объектов.
- одно из полей содержит объект, который в одном из своих полей содержит массив объектов.
Я пытался использовать 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, })]
и так далее.