jest 的.toContainEqual(item)和.toContain的区别?

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 方法的测试会成功,因为它检查的是深度相等,而不是引用相等。

`jest.config.js` 是 Jest 测试框架中的一个重要配置文件,用于自定义测试运行的环境、规则和行为。当你想收集或定制测试结果的行为时,可以在这个文件中设置对应的选项。以下是 `jest.config.js` 中关于收集(collection)的一些关键配置: 1. **testMatch**: 这个字段指定哪些文件将被 Jest 自动检测为测试用例,你可以选择按目录、扩展名或其他模式匹配。 ```javascript testMatch: ['**/__tests__/**/*.js', '**/*.spec.js'], ``` 2. **collectCoverageFrom**: 如果你想控制哪些源代码文件被覆盖率报告统计,可以在这里指定。例如,排除某些不重要或未完成的部分。 ```javascript collectCoverageFrom: ['src/**/*.{js,ts}', '!src/utils/uncovered-file.js'], ``` 3. **coverageReporters**: 这里可以配置生成不同类型的覆盖率报告,如 lcov, json 或 text,便于分析。 ```javascript coverageReporters: ['json', 'lcov', 'text-summary'], ``` 4. **reporters**: 它可以让你自定义测试执行过程中的日志显示,包括测试进度、结果等。 ```javascript reporters: ['default', 'jest-junit'], // 添加JUnit报告 ``` 5. **automock**: 如果你需要自动mock所有导入的模块,可以设置为 `true`,但这样可能会增加打包大小和运行时间。 ```javascript automock: true, ``` 要了解更多信息,你可以查看 Jest 文档中的 [configuration options](https://jestjs.io/docs/configuration) 部分,以及根据具体需求调整上述配置。如果你的问题更具体,请提供详细信息,我会给出更针对性的帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值