Chai.js 中 should.throw 与 assert.throw 有何区别

在使用 Chai.js 进行前端测试时,我们经常会使用 should 和 assert 来判断是否符合预期。其中,should 和 assert 都提供了 throw 方法来判断代码是否抛出了期望的错误,但两者在使用方式和实现原理上存在一些区别。

should.throw

should 的 throw 方法可以用于判断代码是否抛出了期望的错误,并且可以进一步断言错误的类型和错误消息。

以下是一个简单的示例:

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

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

在上述代码中,我们定义了一个函数 throwError,并使用 should.throw 方法来判断它是否会抛出一个指定类型的错误,并且错误消息中包含指定内容。在第一个例子中,我们使用了精确匹配的方式来检查错误消息,而在第二个例子中,则使用了正则表达式来检查。

需要注意的是,在使用 should 的 throw 方法时,需要使用一个函数来包裹要测试的代码,而不能直接传递要测试的函数代码。这是因为 should 会创建一个代理对象来拦截抛出的错误,并断言错误类型和消息等信息。

assert.throw

与 should 不同,assert 的 throw 方法直接传递要测试的代码,而不需要使用一个函数来进行包裹。

以下是一个使用 assert 的 throw 方法的示例:

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

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

在上述代码中,我们使用 assert 的 throw 方法来判断函数 throwError 是否会抛出一个类型为 Error,消息为 'error message' 的错误。

与 should 不同,assert 的 throw 方法不会创建代理对象来拦截抛出的错误,而是直接执行被测试的代码并捕获错误。因此,相对于 should,assert 的 throw 方法更加直观且更易于理解。

区别与选用

综上所述,should 和 assert 的 throw 方法在使用方式和实现原理上存在一些区别,应根据场景和个人喜好来选择使用。

需要注意的是,在使用 should 的 throw 方法时,需要使用一个函数来包裹要测试的代码,这可能会导致代码冗长和不够直接。而 assert 的 throw 方法则可以直接传递函数代码,更容易理解和使用。但与此同时,should 的 throw 方法可以进一步断言错误类型和错误消息,可以进行更加细粒度的判断。

因此,应根据具体情况来选择使用 should 还是 assert 的 throw 方法。在需要进行精细断言时,应该使用 should 的 throw 方法;而在进行基本异常测试时,可以使用 assert 的 throw 方法来进行快捷测试。

结论

Chai.js 中的 should.throw 和 assert.throw 方法虽然用途相同,但使用方式和实现原理上存在一些区别,应根据场景和个人喜好来选择使用。

在需要进行精细断言时,应该使用 should 的 throw 方法;而在进行基本异常测试时,可以使用 assert 的 throw 方法来进行快捷测试。

示例代码

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

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

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

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

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