在程序设计中,断言(assertion)是一种放在程序中的一阶逻辑(如一个结果为真或是假的逻辑判断式),目的是为了标示与验证程序开发者预期的结果-当程序运行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止运行,并给出错误消息。 -- 维基百科
断言是单元测试中用来保证最小单元是否正常的检测方法。如在demo.js中输出一个错误的两数求和函数add:
//demo.js
module.exports = function(a,b){
//此处写成两数相减
return a - b;
}
然后创建一个test.js,使用nodejs提供的assert模块进行检测:
//test.js
'use strict'
const assert = require('assert');
const add = require('./demo');
assert.strictEqual(add(1,2),3);
显然由于函数自身错误,得到的值无法满足期望,此时程序将会抛出一个AssertionError异常(assert 模块抛出的所有错误都是 AssertionError 类的实例),停止运行:
在nodejs的API中定义了几种检测方法:
assert.ok() : 判断结果是否为真。
assert.ok(false,'此为假');
//等同于
assert.equal(!!(add(1,2) === 3),true,'此为假');
assert.ifError() : 判断实际值是否为一个假值(null,undefined,0,'',false),如实际值为真值,则抛出异常。
assert.ifError('');
assert.ifError(' '); //Error: " "
assert.equal() : 判断实际值与期望值是否相等。
assert.notEqual() : 判断实际值与期望值是否相等。
assert.equal(add(1,2),3);
assert.notEqual(add(1,2),3);
assert.deepStrictEqual() : 判断实际值与期望值是否深度相等。
assert.notDeepStrictEqual : 判断实际值与期望值是否不深度相等
assert.deepStrictEqual({a:1},{a:'1'});
assert.notDeepStrictEqual({a:1},{a:'1'});
assert.strictEqual() : 判断实际值与期望值是否严格相等(相当于 ===)
assert.notStrictEqual() : 判断实际值与期望值是否不严格相等(相当于 !==)
assert.strictEqual(1,true);
assert.notStrictEqual(1,true);
assert.throws() : 判断代码块是否抛出异常。
assert.doesNotThrow() : 判断代码块是否没有抛出异常。
//assert.throws(fn[, error][, message])
assert.throws(
() => {
throw new Error('错误值')
},
{
message:'错误',
}
)
assert.throws(
() => {
throw new Error('错误值')
},
{
message:'错误',
},'抛出异常不符合期望'
)
//assert.doesNotThrow(fn[, error][, message])
assert.doesNotThrow(
() => {
throw new TypeError('错误值');
},
/错误值/,
'出错啦'
);
assert.doesNotThrow(
() => {
throw new TypeError('错误值');
}
);
assert.throws(fn[, error][, message])
-
fn
<Function> -
error
<RegExp> | <Function> | <Object> | <Error> -
message
<string>
期望 fn 函数抛出异常。error 则用于指定抛出期望的错误。如果指定 message,则当 fn 调用无法抛出或错误验证失败时, message 将附加到 AssertionError 提供的消息。
assert.doesNotThrow(fn[, error][, message])
-
fn
<Function> -
error
<RegExp> | <Function> -
message
<string>
断言 fn 函数不会抛出错误。若抛出错误且与 error 参数指定的类型相同,则抛出AssertionError。若不同或error参数未定义,则错误将传播回调用方。
断言用于检查程序在运行时是否满足期望。一旦断言检查失败,将会抛出异常停止整个应用。当需要进行多处断言检查时,就需要借助于测试框架(如:mocha),将各测试统一起来执行,并记录执行时抛出的异常,最后输出测试结果。