首页 > 解决方案 > 开玩笑 - 检查项目是否不包含具有某些属性的对象

问题描述

这是我需要检查的回复:

[
  { _id: 'dislike', count: 1 },
  { _id: 'hate', count: 1 },
  { _id: 'trivial', count: 1 }
]

检查现有值很容易:

expect(response.data).toContainEqual({ _id: 'trivial', count: 1 });
expect(response.data).toContainEqual({ _id: 'dislike', count: 1 });
expect(response.data).toContainEqual({ _id: 'hate', count: 1 });

但我需要检查该数组是否不包含带有 { _id: 'neutral' } 的对象。以下测试看起来很成功,因为测试通过了:

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });

但我想确保它符合我的预期,所以我添加了一个会失败的测试。但它没有:

expect(response.data).not.toContain({ _id: 'hate', count: 1 });

你能看到吗你能明白吗?两个测试toContainEqualnot.toContain有效。如何确保数组不包含具有属性的对象_id: 'neutral'

标签: javascriptjestjs

解决方案


匹配器toContain通过使用严格相等检查来检查一个项目是否在数组中。这意味着如果您不传递对您尝试测试的对象的引用,它将始终返回 false。

因此,如果您检查:

expect(response.data).toContain({ _id: 'trivial', count: 1 });

它会失败,因为即使您response.data包含具有相同属性和值的对象,它也不是同一个对象(它不指向同一个引用)。

这就是为什么:

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });

将始终返回 true。

如果要检查特定结构和值,则应使用toContainEqual匹配器:

expect(response.data).not.toContainEqual({ _id: 'hate', count: 1 });

此外,如果您想检查响应数据的整个结构和值,您可以简单地使用toEqual匹配器:

expect(response.data).toEqual([
    { _id: 'dislike', count: 1 },
    { _id: 'hate', count: 1 },
    { _id: 'trivial', count: 1 }
]);

这将检查response.data您作为参数传递的结构和值。对于扩展,它正在检查它是否不包含任何其他值。


推荐阅读