Chai 报错:expected {} to equal {},如何解决

阅读时长 3 分钟读完

Chai 是一个流行的 JavaScript 测试库,用于编写和运行单元测试和集成测试。由于使用集成断言库,因此往往会遇到各种报错。这篇文章将解释一个常见的报错:expected {} to equal {},并说明如何解决它。

报错原因

在测试代码中,您可能会看到类似以下代码的断言:

这个代码的意思是:object1 应该与 object2 相等。然而,当测试运行时,您可能会看到一个奇怪的错误:

这个报错的原因是因为 Chai 默认使用“相等测试(equal testing)”来比较值,而对象本身是引用类型。当两个对象被比较时,它们实际上被比较的是它们的引用地址,而不是它们的值。因此,虽然两个对象的值可能相同,但它们的引用地址不同,从而导致测试失败。

解决方法

为了解决这个问题,您需要使用深度相等测试(deep equal testing)而不是相等测试(equal testing)。

Chai 深度相等测试

Chai 提供了两个深度相等测试方法,分别是 eqldeep.equal。这两者的作用是相同的,它们可以比较两个对象的值是否相等,而不仅仅是它们的引用地址。

在使用这些方法时,您需要注意以下几点:

  • 对象的属性必须完全匹配(包括属性名和值)。
  • 对象的属性位置必须相同。
  • 对象的属性个数必须相同。

以下是使用 eql 方法的示例代码:

以上代码将会判断 object1object2 是否相等,如果相等,则不会报错。

深克隆对象

如果使用深度相等测试的方法仍然无法解决问题,那么可能是由于对象的引用地址不同。这种情况下,您需要使用深克隆对象,确保它们的引用地址相同。

以下是使用 lodashcloneDeep 方法对对象进行深克隆的示例代码:

在以上代码中,我们使用 _.cloneDeep 方法对 object1 进行深克隆,将其赋值给 object2。由于 object1object2 的引用地址相同,因此可以使用 eql 方法对它们进行比较,而不会报错。

总结

这篇文章解释了 Chai 中报错 expected {} to equal {} 的原因,并提供了两种解决方法。在编写前端测试时,使用深度相等测试可以确保对象的值匹配。如果深度相等测试无法解决问题,则需要使用深克隆对象确保它们的引用地址相同,从而实现测试。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6481512948841e98940c7d7c

纠错
反馈