在前端开发中,测试是不可或缺的一部分。而在 JavaScript 测试框架中,Chai 是一个非常受欢迎的断言库,它提供了三种不同的 API 风格:assert、expect 和 should。其中,assert 部分功能和 expect 部分一致,但 API 形式不同。本文将详细介绍 Chai 的 assert 部分,并提供一些示例代码和指导意义。
assert 的基本用法
assert 部分可以用于断言任何类型的表达式。它的基本语法如下:
assert(expression, [message]);
其中,expression 表示要断言的表达式,message 是可选的断言失败时显示的错误信息。
下面是一个简单的示例,用 assert 断言一个数值是否等于 3:
const assert = require('chai').assert; assert.equal(3, 1 + 2);
如果运行这段代码,将不会有任何输出,因为断言成功了。如果把 1 + 2 改成 1 + 3,那么断言就会失败,输出错误信息:
AssertionError: expected 3 to equal 4
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.throws(function() { throw new Error('test error'); }, Error, 'test error');
这样的断言会在函数抛出异常时成功,否则就会失败。
assert 的高级用法
除了基本用法外,assert 还提供了一些高级用法,可以满足更复杂的测试需求。
assert.fail
assert.fail 方法可以用来强制断言失败,可以用于测试预期失败的情况。它的语法如下:
assert.fail(actual, expected, message, operator);
其中,actual 表示实际值,expected 表示预期值,message 是错误信息,operator 是操作符。
下面是一个示例,测试一个函数在输入错误参数时是否会抛出异常:
-- -------------------- ---- ------- -------- --------------- - -- ------- ----- --- --------- - ----- --- ------------ ---- -- - --------- - - ------------------------ - -------------- -- ------------- - ------------------------- ------ ---- -- - --------- ------ ----- ---
这个断言会在 testFunc 函数抛出异常时成功,而且异常的 message 属性必须等于 'param must be a string'。
assert.approximately
assert.approximately 方法可以用来测试数值是否在指定范围内。它的语法如下:
assert.approximately(actual, expected, delta, [message]);
其中,actual 表示实际值,expected 表示预期值,delta 表示允许的误差范围,message 是可选的错误信息。
下面是一个示例,测试一个函数返回的数值是否在 5 ± 0.5 的范围内:
function testFunc() { return 5.2; } assert.approximately(testFunc(), 5, 0.5);
这个断言会在 testFunc 函数返回的值在 4.5 到 5.5 的范围内时成功。
assert.match
assert.match 方法可以用来测试字符串是否匹配指定的正则表达式。它的语法如下:
assert.match(string, regexp, [message]);
其中,string 表示要测试的字符串,regexp 表示要匹配的正则表达式,message 是可选的错误信息。
下面是一个示例,测试一个函数返回的字符串是否以 'hello' 开头:
function testFunc() { return 'hello world'; } assert.match(testFunc(), /^hello/);
这个断言会在 testFunc 函数返回的字符串以 'hello' 开头时成功。
总结
Chai 的 assert 部分提供了丰富的断言方法,可以满足大部分测试需求。除了基本的断言方法外,它还提供了一些高级用法,可以用于测试更复杂的场景。在实际开发中,我们应该根据具体的情况选择合适的断言方法,并编写良好的测试代码,以保证代码的质量和稳定性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65fa7c5fd10417a222659f74