Node.js API详解之 assert模块用法实例分析
本文实例讲述了Node.jsAPI详解之assert模块用法。分享给大家供大家参考,具体如下:
Node.jsAPI详解之assert
assert模块提供了断言测试的函数,用于测试不变式。
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
使用断言可以创建更稳定、品质更好且不易于出错的代码。
当需要在一个值为false时中断当前操作的话,可以使用断言。
单元测试必须使用断言(Junit/JunitX)。
使用方式:
constassert=require('assert');
assert.ok(value[,message])
说明:
测试value是否为真值。相当于assert.equal(!!value,true,message)。
如果value不为真值,则抛出一个带有message属性的AssertionError,
其中message属性的值等于传入的message参数的值。
如果message参数为undefined,则赋予默认的错误信息。
demo:
constassert=require('assert');
assert.ok(true);
//测试通过。
assert.ok(1);
//测试通过。
assert.ok(false);
//抛出"AssertionError:false==true"
assert.ok(0);
//抛出"AssertionError:0==true"
assert.ok(false,'不是真值');
//抛出"AssertionError:不是真值"
assert(value[,message])
说明:
assert.ok()的别名。
用法与assert.ok()相同。
demo:
constassert=require('assert');
assert(true);
//测试通过。
assert(1);
//测试通过。
assert(false);
//抛出"AssertionError:false==true"
assert(0);
//抛出"AssertionError:0==true"
assert(false,'不是真值');
//抛出"AssertionError:不是真值"
assert.ifError(value)
说明:
如果value为真,则抛出value。可用于测试回调函数的error参数。
源码:functionifError(err){if(err)throwerr;};
demo:
constassert=require('assert');
assert.ifError(0);
//通过。
assert.ifError(1);
//抛出1。
assert.ifError('error');
//抛出'error'。
assert.ifError(newError());
//抛出Error。
assert.equal(actual,expected[,message])
说明:
使用相等运算符(==)测试actual参数与expected参数是否相等
demo:
constassert=require('assert');
assert.equal(1,1);
//测试通过,1==1。
assert.equal(1,'1');
//测试通过,1=='1'。
assert.equal(1,2);
//抛出AssertionError:1==2
assert.equal({a:{b:1}},{a:{b:1}});
//抛出AssertionError:{a:{b:1}}=={a:{b:1}}
assert.deepEqual(actual,expected[,message])
说明:
测试actual参数与expected参数是否深度相等。原始值使用相等运算符(==)比较。
只测试可枚举的自身属性,不测试对象的原型、连接符、或不可枚举的属性(这些情况使用assert.deepStrictEqual())。
Map和Set包含的子项也会被测试。
如果两个值不相等,则抛出一个带有message属性的AssertionError,
其中message属性的值等于传入的message参数的值。
如果message参数为undefined,则赋予默认的错误信息。
demo:
constassert=require('assert');
constobj1={
a:{
b:1
}
};
constobj2={
a:{
b:2
}
};
constobj3={
a:{
b:1
}
};
constobj4=Object.create(obj1);
assert.deepEqual(/a/gi,newDate());
//测试通过,因为RegExp对象的属性不是可枚举的:
assert.deepEqual(obj1,obj1);
//测试通过,对象与自身相等。
assert.deepEqual(obj1,obj2);
//抛出AssertionError:{a:{b:1}}deepEqual{a:{b:2}}
//因为b属性的值不同。
assert.deepEqual(obj1,obj3);
//测试通过,两个对象相等。
assert.deepEqual(obj1,obj4);
//抛出AssertionError:{a:{b:1}}deepEqual{}
//因为不测试原型。
assert.deepStrictEqual(actual,expected[,message])
说明:
与assert.deepEqual()大致相同,但有一些区别:
1.原始值使用全等运算符(===)比较。Set的值与Map的键使用SameValueZero比较。
2.对象的原型也使用全等运算符比较。
3.对象的类型标签要求相同。
4.比较[对象包装器][]时,其对象和里面的值要求相同。
demo:
constassert=require('assert');
assert.deepEqual({a:1},{a:'1'});
//测试通过,因为1=='1'。
assert.deepStrictEqual({a:1},{a:'1'});
//抛出AssertionError:{a:1}deepStrictEqual{a:'1'}
//因为使用全等运算符1!=='1'。
//以下对象都没有自身属性。
constdate=newDate();
constobject={};
constfakeDate={};
Object.setPrototypeOf(fakeDate,Date.prototype);
assert.deepEqual(object,fakeDate);
//测试通过,不测试原型。
assert.deepStrictEqual(object,fakeDate);
//抛出AssertionError:{}deepStrictEqualDate{}
//因为原型不同。
assert.deepEqual(date,fakeDate);
//测试通过,不测试类型标签。
assert.deepStrictEqual(date,fakeDate);
//抛出AssertionError:2017-03-11T14:25:31.849ZdeepStrictEqualDate{}
//因为类型标签不同。
assert.deepStrictEqual(newNumber(1),newNumber(2));
//测试不通过,因为数值对象包装器里面的数值也会被比较。
assert.deepStrictEqual(newString('foo'),Object('foo'));
//测试通过,因为这两个对象和里面的字符串都是相同的
assert.strictEqual(actual,expected[,message])
说明:
使用全等运算符(===)测试actual参数与expected参数是否全等。
demo:
onstassert=require('assert');
assert.strictEqual(1,2);
//抛出AssertionError:1===2
assert.strictEqual(1,1);
//测试通过。
assert.strictEqual(1,'1');
//抛出AssertionError:1==='1'
assert.notEqual(actual,expected[,message])
说明:
使用不等运算符(!=)测试actual参数与expected参数是否不相等。
demo:
constassert=require('assert');
assert.notEqual(1,2);
//测试通过。
assert.notEqual(1,1);
//抛出AssertionError:1!=1
assert.notEqual(1,'1');
//抛出AssertionError:1!='1'
assert.notDeepEqual(actual,expected[,message])
说明:
测试actual参数与expected参数是否不深度相等。与assert.deepEqual()相反。
demo:
constassert=require('assert');
constobj1={
a:{
b:1
}
};
constobj2={
a:{
b:2
}
};
constobj3={
a:{
b:1
}
};
constobj4=Object.create(obj1);
assert.notDeepEqual(obj1,obj1);
//抛出AssertionError:{a:{b:1}}notDeepEqual{a:{b:1}}
assert.notDeepEqual(obj1,obj2);
//测试通过,obj1与obj2不深度相等。
assert.notDeepEqual(obj1,obj3);
//抛出AssertionError:{a:{b:1}}notDeepEqual{a:{b:1}}
assert.notDeepEqual(obj1,obj4);
//测试通过,obj1与obj4不深度相等。
assert.notDeepStrictEqual(actual,expected[,message])
说明:
测试actual参数与expected参数是否不深度全等。与assert.deepStrictEqual()相反。
demo:
constassert=require('assert');
assert.notDeepEqual({a:1},{a:'1'});
//抛出AssertionError:{a:1}notDeepEqual{a:'1'}
assert.notDeepStrictEqual({a:1},{a:'1'});
//测试通过。
assert.notStrictEqual(actual,expected[,message])
说明:
使用不全等运算符(!==)测试actual参数与expected参数是否不全等。
demo:
constassert=require('assert');
assert.notStrictEqual(1,2);
//测试通过。
assert.notStrictEqual(1,1);
//抛出AssertionError:1!==1
assert.notStrictEqual(1,'1');
//测试通过。
assert.fail(message)
assert.fail(actual,expected[,message[,operator[,stackStartFunction]]])
说明:
抛出AssertionError。如果message参数为空,则错误信息为actual参数+operator参数+expected参数。
如果只提供了actual参数与expected参数,则operator参数默认为‘!='。
如果提供了message参数,则它会作为错误信息,其他参数会保存在错误对象的属性中。
如果提供了stackStartFunction参数,则该函数上的栈帧都会从栈信息中移除
demo:
constassert=require('assert');
assert.fail(1,2,undefined,'>');
//抛出AssertionError[ERR_ASSERTION]:1>2
assert.fail(1,2,'错误信息');
//抛出AssertionError[ERR_ASSERTION]:错误信息
assert.fail(1,2,'错误信息','>');
//抛出AssertionError[ERR_ASSERTION]:错误信息
//上面两个例子的`actual`参数、`expected`参数与`operator`参数不影响错误消息。
assert.fail();
//抛出AssertionError[ERR_ASSERTION]:Failed
assert.fail('错误信息');
//抛出AssertionError[ERR_ASSERTION]:错误信息
assert.fail('a','b');
//抛出AssertionError[ERR_ASSERTION]:'a'!='b'
//使用stackStartFunction参数拦截异常的栈信息:
functionsuppressFrame(){
assert.fail('a','b',undefined,'!==',suppressFrame);
}
suppressFrame();
//AssertionError[ERR_ASSERTION]:'a'!=='b'
//atrepl:1:1
//atContextifyScript.Script.runInThisContext(vm.js:44:33)
//...
assert.throws(block[,error][,message])
说明:
断言block函数会抛出错误。
error参数可以是构造函数、正则表达式、或自定义函数。
如果指定了message参数,则当block函数不抛出错误时,message参数会作为AssertionError的错误信息。
demo:
constassert=require('assert');
assert.throws(
()=>{
thrownewError('错误信息');
},
/123/
);
//Error:错误信息
assert.throws(
()=>{
thrownewError('错误信息');
},
/错误/
);
//通过
assert.throws(
()=>{
thrownewError('错误信息');
},
Error
);
//通过
assert.throws(
()=>{
thrownewError('错误信息');
},
function(err){
if((errinstanceofError)&&/错误/.test(err)){
returntrue;
}
},
'不是期望的错误'
);
//通过
//error参数不能是字符串。如果第二个参数是字符串,则视为省略error参数,传入的字符串会被用于message参数。
//这是错误的!不要这么做!
assert.throws(()=>{
thrownewError('错误信息');
},'错误信息','没有抛出期望的信息');
//应该这么做。
assert.throws(()=>{
thrownewError('错误信息');
},/错误信息/,'没有抛出期望的信息');
assert.doesNotThrow(block[,error][,message])
说明:
断言block函数不会抛出错误。
当assert.doesNotThrow()被调用时,它会立即调用block函数。
如果抛出错误且错误类型与error参数指定的相同,则抛出AssertionError。
如果错误类型不相同,或error参数为undefined,则抛出错误。
demo:
constassert=require('assert');
assert.doesNotThrow(
()=>{
thrownewTypeError('错误信息');
},
SyntaxError
);
//TypeError:错误信息
assert.doesNotThrow(
()=>{
thrownewTypeError('错误信息');
},
TypeError
);
//AssertionError[ERR_ASSERTION]:Gotunwantedexception.
//错误信息
//如果抛出了AssertionError且有给message参数传值,则message参数的值会被附加到AssertionError的信息中:
assert.doesNotThrow(
()=>{
thrownewTypeError('错误信息');
},
TypeError,
'抛出错误'
);
//AssertionError[ERR_ASSERTION]:Gotunwantedexception:抛出错误
//错误信息
注意事项
说明:
对于SameValueZero比较,建议使用ES2015的Object.is()。
demo:
consta=0; constb=-a; assert.notStrictEqual(a,b); //抛出AssertionError:0!==-0 //因为全等运算符不区分-0与+0。 assert(!Object.is(a,b)); //但Object.is()可以区分。 conststr1='foo'; conststr2='foo'; assert.strictEqual(str1/1,str2/1); //抛出AssertionError:NaN===NaN //因为全等运算符不能用于测试NaN。 assert(Object.is(str1/1,str2/1)); //但Object.is()可以测试。
SameValueZero
说明:
内部比较操作SameValueZero(x,y)
如果typeofx不同于typeofy,返回false。
如果typeofx是数字,那么
如果x为NaN,y为NaN,返回true。
如果x是+0而y是-0,返回true。
如果x是-0而y是+0,返回true。
如果x与y相同,则返回true。
返回假。
希望本文所述对大家node.js程序设计有所帮助。