Node.js API详解之 assert模块用法实例分析


Posted in Javascript onMay 26, 2020

本文实例讲述了Node.js API详解之 assert模块用法。分享给大家供大家参考,具体如下:

Node.js API详解之 assert

assert 模块提供了断言测试的函数,用于测试不变式。
断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
使用断言可以创建更稳定、品质更好且不易于出错的代码。
当需要在一个值为false时中断当前操作的话,可以使用断言。
单元测试必须使用断言(Junit/JunitX)。

使用方式:

const assert = require('assert');

assert.ok(value[, message])

说明:

测试 value 是否为真值。 相当于 assert.equal(!!value, true, message)。
如果 value 不为真值,则抛出一个带有 message 属性的 AssertionError,
其中 message 属性的值等于传入的 message 参数的值。
如果 message 参数为 undefined,则赋予默认的错误信息。

demo:

const assert = 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:

const assert = 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 参数。
源码:function ifError(err) { if (err) throw err; };

demo:

const assert = require('assert');
assert.ifError(0);
// 通过。
assert.ifError(1);
// 抛出 1。
assert.ifError('error');
// 抛出 'error'。
assert.ifError(new Error());
// 抛出 Error。

assert.equal(actual, expected[, message])

说明:

使用相等运算符(==)测试 actual 参数与 expected 参数是否相等

demo:

const assert = 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:

const assert = require('assert');
const obj1 = {
 a: {
  b: 1
 }
};
const obj2 = {
 a: {
  b: 2
 }
};
const obj3 = {
 a: {
  b: 1
 }
};
const obj4 = Object.create(obj1);
assert.deepEqual(/a/gi, new Date());
//测试通过,因为 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:

const assert = require('assert');
assert.deepEqual({ a: 1 }, { a: '1' });
// 测试通过,因为 1 == '1'。
assert.deepStrictEqual({ a: 1 }, { a: '1' });
// 抛出 AssertionError: { a: 1 } deepStrictEqual { a: '1' }
// 因为使用全等运算符 1 !== '1'。
// 以下对象都没有自身属性。
const date = new Date();
const object = {};
const fakeDate = {};
Object.setPrototypeOf(fakeDate, Date.prototype);
assert.deepEqual(object, fakeDate);
// 测试通过,不测试原型。
assert.deepStrictEqual(object, fakeDate);
// 抛出 AssertionError: {} deepStrictEqual Date {}
// 因为原型不同。
assert.deepEqual(date, fakeDate);
// 测试通过,不测试类型标签。
assert.deepStrictEqual(date, fakeDate);
// 抛出 AssertionError: 2017-03-11T14:25:31.849Z deepStrictEqual Date {}
// 因为类型标签不同。
assert.deepStrictEqual(new Number(1), new Number(2));
// 测试不通过,因为数值对象包装器里面的数值也会被比较。
assert.deepStrictEqual(new String('foo'), Object('foo'));
// 测试通过,因为这两个对象和里面的字符串都是相同的

assert.strictEqual(actual, expected[, message])

说明:

使用全等运算符(===)测试 actual 参数与 expected 参数是否全等。

demo:

onst assert = 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:

const assert = 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:

const assert = require('assert');
const obj1 = {
 a: {
  b: 1
 }
};
const obj2 = {
 a: {
  b: 2
 }
};
const obj3 = {
 a: {
  b: 1
 }
};
const obj4 = 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:

const assert = 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:

const assert = 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:

const assert = 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 参数拦截异常的栈信息:
function suppressFrame() {
 assert.fail('a', 'b', undefined, '!==', suppressFrame);
}
suppressFrame();
// AssertionError [ERR_ASSERTION]: 'a' !== 'b'
//   at repl:1:1
//   at ContextifyScript.Script.runInThisContext (vm.js:44:33)
//   ...

assert.throws(block[, error][, message])

说明:

断言 block 函数会抛出错误。
error 参数可以是构造函数、正则表达式、或自定义函数。
如果指定了 message 参数,则当 block 函数不抛出错误时,message 参数会作为 AssertionError 的错误信息。

demo:

const assert = require('assert');
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /123/
);
// Error: 错误信息
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 /错误/
);
// 通过
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 Error
);
// 通过
assert.throws(
 () => {
  throw new Error('错误信息');
 },
 function(err) {
  if ((err instanceof Error) && /错误/.test(err)) {
   return true;
  }
 },
 '不是期望的错误'
);
// 通过
// error 参数不能是字符串。 如果第二个参数是字符串,则视为省略 error 参数,传入的字符串会被用于 message 参数。
// 这是错误的!不要这么做!
assert.throws(() => {
  throw new Error('错误信息');
 }, '错误信息', '没有抛出期望的信息');
 
// 应该这么做。
assert.throws(() => {
  throw new Error('错误信息');
 }, /错误信息/, '没有抛出期望的信息');

assert.doesNotThrow(block[, error][, message])

说明:

断言 block 函数不会抛出错误。
当 assert.doesNotThrow() 被调用时,它会立即调用 block 函数。
如果抛出错误且错误类型与 error 参数指定的相同,则抛出 AssertionError。
如果错误类型不相同,或 error 参数为 undefined,则抛出错误。

demo:

const assert = require('assert');
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 SyntaxError
);
// TypeError: 错误信息
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 TypeError
);
// AssertionError [ERR_ASSERTION]: Got unwanted exception.
// 错误信息
// 如果抛出了 AssertionError 且有给 message 参数传值,则 message 参数的值会被附加到 AssertionError 的信息中:
assert.doesNotThrow(
 () => {
  throw new TypeError('错误信息');
 },
 TypeError,
 '抛出错误'
);
// AssertionError [ERR_ASSERTION]: Got unwanted exception: 抛出错误
// 错误信息

注意事项

说明:

对于 SameValueZero 比较,建议使用 ES2015 的 Object.is()。

demo:

const a = 0;
const b = -a;
assert.notStrictEqual(a, b);
// 抛出 AssertionError: 0 !== -0
// 因为全等运算符不区分 -0 与 +0。
assert(!Object.is(a, b));
// 但 Object.is() 可以区分。
const str1 = 'foo';
const str2 = 'foo';
assert.strictEqual(str1 / 1, str2 / 1);
// 抛出 AssertionError: NaN === NaN
// 因为全等运算符不能用于测试 NaN。
assert(Object.is(str1 / 1, str2 / 1));
// 但 Object.is() 可以测试。

SameValueZero

说明:

内部比较操作SameValueZero(x,y)
如果 type of x 不同于 type of y,返回false。
如果 type of x 是数字,那么
如果 x 为 NaN, y 为 NaN,返回 true。
如果 x 是 +0 而 y 是 -0,返回 true。
如果 x 是 -0 而 y 是 +0,返回 true。
如果 x 与 y 相同,则返回 true。
返回 假。

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
jQuery使用手册之 事件处理
Mar 24 Javascript
关于JavaScript中var声明变量作用域的推断
Dec 16 Javascript
JavaScript 的继承
Oct 01 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
超赞的动手创建JavaScript框架的详细教程
Jun 30 Javascript
JavaScript File API文件上传预览
Feb 02 Javascript
BootStrap中的table实现数据填充与分页应用小结
May 26 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
Jul 24 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
Aug 15 Javascript
JS前端加密算法示例
Dec 22 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 Javascript
JavaScript实现答题评分功能页面
Jun 24 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
May 26 #Javascript
js校验开始时间和结束时间
May 26 #Javascript
vue实现简单跑马灯效果
May 25 #Javascript
Js和VUE实现跑马灯效果
May 25 #Javascript
Vue实现简单的跑马灯
May 25 #Javascript
Vue实现跑马灯效果
May 25 #Javascript
JavaScript实现移动端弹窗后禁止滚动
May 25 #Javascript
You might like
PHP校验ISBN码的函数代码
2011/01/17 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
JavaScript和JQuery获取DIV值的方法示例
2017/03/07 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
2017/04/11 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
react-router4 嵌套路由的使用方法
2017/07/24 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
讲解Python中fileno()方法的使用
2015/05/24 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
Python全局变量与global关键字常见错误解决方案
2020/10/05 Python
车库门开启器、遥控器和零件:Chamberlain
2019/04/09 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
企业统计员岗位职责
2013/12/13 职场文书
遗体告别仪式答谢词
2014/01/23 职场文书
大学生党员自我批评
2014/02/14 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
CSS几步实现赛博朋克2077风格视觉效果
2021/06/16 HTML / CSS
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Python Matplotlib库实现画局部图
2021/11/17 Python