Jest-检查项是否包含具有某些属性的对象



这是我需要检查的响应:

[
{ _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'的对象?

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

因此,如果您检查:

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

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

这就是为什么:

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

将永远返回真实。

如果您想检查特定的结构和值,您应该使用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是否具有作为参数传递的结构和值。对于扩展,它检查它是否不包含任何其他值。

您可以使用Array.prototype.some()

expect(response.data.some(({_id}) => _id === "neutral")).toBe(false)

当条件第一次满足时,Array.prototype.some()返回布尔值true,如果不满足则返回false。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

最新更新