jest
的 .toContainEqual(item)
和 .toContain(item)
方法在测试数组或可迭代对象时,虽然都用于检查某个元素是否存在,但它们之间存在关键的区别:
.toContain(item)
- 严格相等:这个方法检查数组或可迭代对象中是否严格包含(即使用
===
运算符)给定的item
。 - 对象引用:对于对象来说,这意味着数组中的对象必须是与
item
相同的引用(即它们必须是同一个对象的引用)。如果对象的内容相同但引用不同,则.toContain
会认为它们不相等。 - 数组顺序:对于数组中的数组或嵌套数组,
.toContain
也会检查元素是否按顺序存在,但它仍然使用严格相等来比较。
.toContainEqual(item)
- 深度相等:这个方法检查数组或可迭代对象中是否包含与给定的
item
深度相等的元素。深度相等意味着对象或数组的结构和值必须相等,但不必是同一个引用。 - 忽略属性顺序(仅对于对象):对于对象,
.toContainEqual
不仅会检查属性值是否相等,还会忽略属性的顺序。只要两个对象包含相同的键值对,无论顺序如何,它们都被认为是深度相等的。 - 数组顺序:对于数组中的数组或嵌套数组,
.toContainEqual
不会像.toContain
那样严格要求顺序。它只关心是否存在一个深度相等的数组元素,而不关心它在数组中的位置。
示例
const array = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
];
// 使用 .toContain
test('array contains Alice object by reference', () => {
const alice = { id: 1, name: 'Alice' };
expect(array).toContain(alice); // 这将失败,因为 alice 和 array[0] 是不同的引用
});
// 使用 .toContainEqual
test('array contains Alice object by value', () => {
expect(array).toContainEqual({ id: 1, name: 'Alice' }); // 这将成功,因为深度相等
});
// 对于数组中的数组
const arrayOfArrays = [
[1, 2, 3],
[4, 5, 6],
];
// 使用 .toContain
test('arrayOfArrays contains [4, 5, 6] by reference', () => {
const subset = [4, 5, 6];
expect(arrayOfArrays).toContain(subset); // 这将失败,因为 subset 和 arrayOfArrays[1] 是不同的引用
});
// 使用 .toContainEqual
test('arrayOfArrays contains [4, 5, 6] by value', () => {
expect(arrayOfArrays).toContainEqual([4, 5, 6]); // 这将成功,因为深度相等
});
在上面的示例中,.toContain
方法的测试会失败,因为即使对象或数组的内容相同,它们也必须是相同的引用才能被认为是相等的。而 .toContainEqual
方法的测试会成功,因为它检查的是深度相等,而不是引用相等。