解决使用 Chai 时出现的预期与实际值不符的断言错误

在进行前端开发时,我们会经常用到 Chai.js 这样的测试库,它是一个断言库,可以让我们方便地进行单元测试和集成测试。但是在实际使用过程中,我们经常会遇到 " AssertionError: expected 2 to equal 3 " 的错误,这是因为预期值与实际值不同所致。 本文将重点介绍如何解决 Chai.js 中出现的预期与实际值不符的错误。

问题背景

假设我们有以下一个测试用例:

----------------- ---------- -
  ---------------------- ---------- -
    ---------- ------ -- ---- --- ----- -- --- --------- ---------- -
      ---------------- --------------------
    ---
  ---
---

我们的期望是在数组 [1, 2, 3] 中查找到 4 的位置,返回 -1,然而事实却是实际返回了 0。这会导致测试失败,控制台会报出如下错误:

--------------- -------- - -- ----- --

这是因为我们期望返回值为 -1,但实际返回值为 0,所以出现了错误。

解决方案

1. 添加详细提示信息

Chai.js 提供了一个方法: assert.strictEqual(),在出现错误时,它会返回一个详细的错误提示信息。例如:

---------- ------ -- ---- --- ----- -- --- --------- ---------- -
  --- --- - --------
  --- --- - --
  --- -------- - ---
  --- ------ - -----------------
  --- ------- - ---- ----- - - --- - - -- --- ------- -- --- ----- - - ----

  -------------------------- --------- ---------
---

这样一来,当测试失败时,我们就能得到更加详细的错误提示信息,如下:

--------------- --- ----- - -- --- ------- -- --- ----- - -- -- - -- -------- - -- ----- --

在这个错误提示信息中,我们不仅能看到具体的实际值和预期值,还可以直接了解当前的测试用例是什么。

2. 使用 .deep 匹配

有时候,我们需要比较的对象是一个复杂的数据结构,比如一个对象或数组。此时,我们可以使用 .deep 匹配,它会对对象或数组的每个键值进行比较,只要任何一个键值不同,就会返回错误。

---------- ------- --- ------- -------- ---------- -
  --- -------- - --- -- -- --- ----
  --- ------ - --- -- -- --- ----

  ------------------------ ----------
---

在这个例子中,我们比较了两个对象 actualexpected 是否相等。使用 .deepEqual() 方法,对于 b 键值下的每个键值都会逐个进行比较。如果遇到错误,assert 会返回类似这样的错误提示:

--------------- -------- - -- -- -- - -- - - - -- ------ ----- - -- -- -- - -- - - -

3. 应用正则表达式匹配

有时候,我们需要比较的值可能是字符串,并且我们只需要确定一部分字符串是否匹配。这时可以使用正则表达式比较。

---------- ----- ---- ------- ------------ ---------- -
  --- -------- - ------ -------
  --- ------ - ------ -------

  -------------------- ----------
---

在这个例子中,我们比较了变量 actual 中是否包含 Hello。如果不包含,则按照正常方式输出错误信息。

4. 处理异常情况

有时候,我们需要测试一些异常情况,例如一个应用在接收到无效输入时是否会抛出错误。

---------- ----- -- ----- ----- ------- ------- ---------- -
  --- ------------ - ------
  --- ------- - -------- ------ - - -------------

  ------------------------ -
    ------------------------------
  -- ------ ---------
---

在这个例子中,我们断定 doSomethingWith() 在接收到无效的输入时(这里用了一个字符串 abc 来模拟),应该抛出一个带有特定错误信息的异常。如果 doSomethingWith() 没有抛出任何异常,我们的测试将会失败。

结论

通过以上的几种方法,我们可以更好的使用 Chai.js 进行单元测试和集成测试。使用这些方法,我们可以准确的找到错误,从而更好的保证代码质量。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672c2b59ddd3a70eb6d53f45