Chai 是一个流行的 JavaScript 测试库,用于编写和运行单元测试和集成测试。由于使用集成断言库,因此往往会遇到各种报错。这篇文章将解释一个常见的报错:expected {} to equal {}
,并说明如何解决它。
报错原因
在测试代码中,您可能会看到类似以下代码的断言:
expect(object1).to.equal(object2);
这个代码的意思是:object1
应该与 object2
相等。然而,当测试运行时,您可能会看到一个奇怪的错误:
expected {} to equal {}
这个报错的原因是因为 Chai 默认使用“相等测试(equal testing)”来比较值,而对象本身是引用类型。当两个对象被比较时,它们实际上被比较的是它们的引用地址,而不是它们的值。因此,虽然两个对象的值可能相同,但它们的引用地址不同,从而导致测试失败。
解决方法
为了解决这个问题,您需要使用深度相等测试(deep equal testing)而不是相等测试(equal testing)。
Chai 深度相等测试
Chai 提供了两个深度相等测试方法,分别是 eql
和 deep.equal
。这两者的作用是相同的,它们可以比较两个对象的值是否相等,而不仅仅是它们的引用地址。
在使用这些方法时,您需要注意以下几点:
- 对象的属性必须完全匹配(包括属性名和值)。
- 对象的属性位置必须相同。
- 对象的属性个数必须相同。
以下是使用 eql
方法的示例代码:
const object1 = { a: 1, b: 2, c: { d: 4 } }; const object2 = { a: 1, b: 2, c: { d: 4 } }; expect(object1).to.eql(object2);
以上代码将会判断 object1
和 object2
是否相等,如果相等,则不会报错。
深克隆对象
如果使用深度相等测试的方法仍然无法解决问题,那么可能是由于对象的引用地址不同。这种情况下,您需要使用深克隆对象,确保它们的引用地址相同。
以下是使用 lodash
的 cloneDeep
方法对对象进行深克隆的示例代码:
const object1 = { a: 1, b: 2, c: { d: 4 } }; const object2 = _.cloneDeep(object1); expect(object1).to.eql(object2);
在以上代码中,我们使用 _.cloneDeep
方法对 object1
进行深克隆,将其赋值给 object2
。由于 object1
和 object2
的引用地址相同,因此可以使用 eql
方法对它们进行比较,而不会报错。
总结
这篇文章解释了 Chai 中报错 expected {} to equal {}
的原因,并提供了两种解决方法。在编写前端测试时,使用深度相等测试可以确保对象的值匹配。如果深度相等测试无法解决问题,则需要使用深克隆对象确保它们的引用地址相同,从而实现测试。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6481512948841e98940c7d7c