Chai 报错 TypeError: Cannot read property 'throw' of undefined 的解决方法

简介

在前端开发中,单元测试是常见的开发方式,而 Chai 是一个流行的 JavaScript 断言库,它提供了多种语法供开发者进行测试。然而,使用 Chai 进行测试时,有时会出现 TypeError: Cannot read property 'throw' of undefined 这样的报错,本文将介绍该报错的原因和解决方法。

原因

通常情况下,该报错是由于使用了 Chai 的 throw 断言,但其参数没有被正确设置。在使用 throw 断言时,必须提供一个函数来执行,在该函数中抛出异常。如果未提供该函数,则会出现 TypeError: Cannot read property 'throw' of undefined 报错。

下面是一个示例代码:

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

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

在该示例中,expect 的参数是一个空箭头函数,该函数中没有抛出异常。因此,执行 expect(() => {}).to.throw('error') 时,会出现 TypeError: Cannot read property 'throw' of undefined 报错。

解决方法

为了解决该报错,需要确保使用 throw 断言时,提供了一个函数,在该函数中抛出异常。可以通过以下两种方式来避免该报错:

方式一

在使用 throw 断言时,确保提供了一个函数,在该函数中抛出异常。下面是一个修复示例:

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

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

在修复的示例中,提供了一个函数,在该函数中抛出了一个 Error 异常。执行 expect(() => {}).to.throw('error') 时,不再出现 TypeError: Cannot read property 'throw' of undefined 报错。

方式二

避免使用 throw 断言。如果不需要测试代码抛出异常的情况,可以使用其他的断言。

下面是一个示例代码,使用了不依赖于 throw 的断言 expect().to.exist:

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

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

在该示例中,使用了 expect(obj).to.exist,而不是 expect(() => {}).to.throw('error')。由于不需要测试代码抛出异常的情况,因此避免了出现 TypeError: Cannot read property 'throw' of undefined 报错。

结论

在使用 Chai 进行单元测试时,避免出现 TypeError: Cannot read property 'throw' of undefined 报错的方法,是确保使用 throw 断言时,提供了一个函数,在该函数中抛出异常。或者避免使用 throw 断言,选择其他的断言。这样能够保证单元测试的进行,为代码质量保驾护航。

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