这是我需要检查的响应:
[
{ _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 });
你看见了吗?测试toContainEqual
和not.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