Проверьте, что объект имеет одно свойство, но не другое, используя toMatchObject в шутку

#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 .