使用Jest中的toMatchObject检查对象是否具有一个属性,但没有另一个属性

时间:2019-03-29 03:40:14

标签: 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(我需要在多个测试中使用)。

2 个答案:

答案 0 :(得分:0)

清除未定义的属性,然后进行比较

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 :(得分:0)

对此表示怀疑,但仍然希望知道是否有更好的方法:

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() }),
   ]),
   ...
});