#javascript #jestjs
#javascript #jestjs
Вопрос:
Допустим, что-то возвращает сложный объект:
const value = {
...,
client: { ... },
...
};
Я хочу протестировать кучу свойств, и для client
я хочу убедиться, что у него есть определенное name
, но нет id
вообще.
Как мне это реализовать?
expect(value).toMatchObject({
...,
client: ???,
...
});
Если бы это было просто, name
я бы сделал client: { name: 'expected' }
.
Я пробовал client: { id: undefined, name: "expected" }
, но undefined
это не то же самое, что «не имеет свойства».
Я знаю, что могу использовать отдельный случай expect(value).not.toHaveProperty('client.name')
, но было бы здорово иметь только один toMatchObject
(мне это нужно в нескольких тестах).
Ответ №1:
Разобрано с этим, но все еще интересно узнать, есть ли лучший способ:
expect.extend({
matchingAll(actual, expected) {
return { pass: expected.every(e => e.asymmetricMatch(actual)) };
}
});
expect(value).toMatchObject({
...,
client: expect.matchingAll([
expect.objectContaining({ name: 'expected' }),
expect.not.objectContaining({ id: expect.anything() }),
]),
...
});
Ответ №2:
очистите свойство undefined и после для сравнения
function clear(a){
Object.keys(a).forEach(key => {
if (a[key] === undefined) {
delete a[key];
}
});
}
let client = { id: undefined, name: "expected" }
clear(client )
console.log(client)
Комментарии:
1. Это наоборот. В моем случае
value
это что-то вроде{ client: { name: 'expected' } }
, так что уже нетundefined
. Мне нужен сопоставитель, который может соответствовать этому, гарантируя отсутствиеid
.