Chai 的 assert 部分介绍

在前端开发中,测试是不可或缺的一部分。而在 JavaScript 测试框架中,Chai 是一个非常受欢迎的断言库,它提供了三种不同的 API 风格:assert、expect 和 should。其中,assert 部分功能和 expect 部分一致,但 API 形式不同。本文将详细介绍 Chai 的 assert 部分,并提供一些示例代码和指导意义。

assert 的基本用法

assert 部分可以用于断言任何类型的表达式。它的基本语法如下:

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

其中,expression 表示要断言的表达式,message 是可选的断言失败时显示的错误信息。

下面是一个简单的示例,用 assert 断言一个数值是否等于 3:

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

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

如果运行这段代码,将不会有任何输出,因为断言成功了。如果把 1 + 2 改成 1 + 3,那么断言就会失败,输出错误信息:

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

assert 还提供了一些其他的方法,用于断言不同类型的表达式。下面是一些常用的方法:

  • assert.notEqual(actual, expected, [message])
  • assert.strictEqual(actual, expected, [message])
  • assert.notStrictEqual(actual, expected, [message])
  • assert.deepEqual(actual, expected, [message])
  • assert.notDeepEqual(actual, expected, [message])
  • assert.isTrue(expression, [message])
  • assert.isFalse(expression, [message])
  • assert.isNull(expression, [message])
  • assert.isNotNull(expression, [message])
  • assert.isUndefined(expression, [message])
  • assert.isDefined(expression, [message])
  • assert.isFunction(expression, [message])
  • assert.isNotFunction(expression, [message])
  • assert.isObject(expression, [message])
  • assert.isNotObject(expression, [message])
  • assert.isArray(expression, [message])
  • assert.isNotArray(expression, [message])
  • assert.isString(expression, [message])
  • assert.isNotString(expression, [message])
  • assert.isNumber(expression, [message])
  • assert.isNotNumber(expression, [message])
  • assert.isBoolean(expression, [message])
  • assert.isNotBoolean(expression, [message])
  • assert.typeOf(expression, type, [message])
  • assert.notTypeOf(expression, type, [message])
  • assert.instanceOf(expression, constructor, [message])
  • assert.notInstanceOf(expression, constructor, [message])
  • assert.include(haystack, needle, [message])
  • assert.notInclude(haystack, needle, [message])
  • assert.match(expression, regexp, [message])
  • assert.notMatch(expression, regexp, [message])
  • assert.property(object, property, [message])
  • assert.notProperty(object, property, [message])
  • assert.deepProperty(object, property, [message])
  • assert.notDeepProperty(object, property, [message])
  • assert.propertyVal(object, property, value, [message])
  • assert.propertyNotVal(object, property, value, [message])
  • assert.deepPropertyVal(object, property, value, [message])
  • assert.deepPropertyNotVal(object, property, value, [message])
  • assert.lengthOf(expression, length, [message])
  • assert.throws(function, [constructor/string/regexp], [message])
  • assert.doesNotThrow(function, [constructor/string/regexp], [message])
  • assert.closeTo(actual, expected, delta, [message])
  • assert.approximately(actual, expected, delta, [message])
  • assert.sameMembers(set1, set2, [message])
  • assert.sameDeepMembers(set1, set2, [message])
  • assert.oneOf(expression, members, [message])
  • assert.notOneOf(expression, members, [message])
  • assert.changes(function, object, property, [message])
  • assert.doesNotChange(function, object, property, [message])
  • assert.increases(function, object, property, [message])
  • assert.doesNotIncrease(function, object, property, [message])
  • assert.decreases(function, object, property, [message])
  • assert.doesNotDecrease(function, object, property, [message])
  • assert.ifError(expression)

这些方法可以满足大部分测试需求。比如,要测试一个函数是否抛出了异常,可以使用 assert.throws 方法:

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

这样的断言会在函数抛出异常时成功,否则就会失败。

assert 的高级用法

除了基本用法外,assert 还提供了一些高级用法,可以满足更复杂的测试需求。

assert.fail

assert.fail 方法可以用来强制断言失败,可以用于测试预期失败的情况。它的语法如下:

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

其中,actual 表示实际值,expected 表示预期值,message 是错误信息,operator 是操作符。

下面是一个示例,测试一个函数在输入错误参数时是否会抛出异常:

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

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

这个断言会在 testFunc 函数抛出异常时成功,而且异常的 message 属性必须等于 'param must be a string'。

assert.approximately

assert.approximately 方法可以用来测试数值是否在指定范围内。它的语法如下:

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

其中,actual 表示实际值,expected 表示预期值,delta 表示允许的误差范围,message 是可选的错误信息。

下面是一个示例,测试一个函数返回的数值是否在 5 ± 0.5 的范围内:

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

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

这个断言会在 testFunc 函数返回的值在 4.5 到 5.5 的范围内时成功。

assert.match

assert.match 方法可以用来测试字符串是否匹配指定的正则表达式。它的语法如下:

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

其中,string 表示要测试的字符串,regexp 表示要匹配的正则表达式,message 是可选的错误信息。

下面是一个示例,测试一个函数返回的字符串是否以 'hello' 开头:

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

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

这个断言会在 testFunc 函数返回的字符串以 'hello' 开头时成功。

总结

Chai 的 assert 部分提供了丰富的断言方法,可以满足大部分测试需求。除了基本的断言方法外,它还提供了一些高级用法,可以用于测试更复杂的场景。在实际开发中,我们应该根据具体的情况选择合适的断言方法,并编写良好的测试代码,以保证代码的质量和稳定性。

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