在使用 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