开玩笑 - 检查该项目不包含具有某些属性的对象

Leo*_*rak 9 javascript jestjs

这是我的回复,我需要检查:

[
  { _id: 'dislike', count: 1 },
  { _id: 'hate', count: 1 },
  { _id: 'trivial', count: 1 }
]
Run Code Online (Sandbox Code Playgroud)

检查现有值很容易:

expect(response.data).toContainEqual({ _id: 'trivial', count: 1 });
expect(response.data).toContainEqual({ _id: 'dislike', count: 1 });
expect(response.data).toContainEqual({ _id: 'hate', count: 1 });
Run Code Online (Sandbox Code Playgroud)

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

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });
Run Code Online (Sandbox Code Playgroud)

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

expect(response.data).not.toContain({ _id: 'hate', count: 1 });
Run Code Online (Sandbox Code Playgroud)

你知道吗?两个测试toContainEqualnot.toContain都是有效的。如何确保数组不包含具有属性的对象_id: 'neutral'

mga*_*cia 12

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

因此,如果您检查:

expect(response.data).toContain({ _id: 'trivial', count: 1 });
Run Code Online (Sandbox Code Playgroud)

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

这就是原因:

expect(response.data).not.toContain({ _id: 'neutral', count: 0 });
Run Code Online (Sandbox Code Playgroud)

总是会返回true。

如果您想检查特定的结构和值,您应该使用toContainEqual匹配器:

expect(response.data).not.toContainEqual({ _id: 'hate', count: 1 });
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 4

你可以这样做Array.prototype.some()

expect(response.data.some(({_id}) => _id === "neutral")).toBe(false)
Run Code Online (Sandbox Code Playgroud)

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

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