Node.js——assert断言模块

assert断言模块

在Node.js中,可以利用assert模块进行断言处理,即书写一些判断用测试代码,如果判断结果为假,则抛出AssertionError异常。接下来,我们对assert模块中的所有方法进行详细介绍。

1、equal()和notEqual()

注意:equal方法与notEqual方法仅对两个值进行比较判断,并不连同两个值的数据类型一起判断。例如,对值1与"1"进行判断时,判断结果为真。

equal方法用于判断两个值是否相等,在Node.js内部使用"=="操作符进行判断,使用方式如下所示:

js 复制代码
assert.equal(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息
js 复制代码
const assert = require('assert');
console.log(assert.equal(1, '2'));
复制代码
AssertionError [ERR_ASSERTION]: 1 == '2'
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: 1,
  expected: '2',
  operator: '=='
}

notEqual方法的作用与equal方法的作用相反,用于判断两个值是否不相等,在Node.js内部使用"!="操作符进行判断,使用方式如下所示。

js 复制代码
assert.notEqual(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息
js 复制代码
const assert = require('assert');
console.log(assert.notEqual(1, '1'));
复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: 1,
  expected: '1',
  operator: '!='
}

2、strictEqual()与notStrictEqual()

如果需要对两个值及其数据类型是否相等进行判断,则需要使用strictEqual方法(在Node.js内部使用"==="操作符进行判断)​,代码如下所示:

js 复制代码
assert.strictEqual(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息
js 复制代码
const assert = require('assert');
console.log(assert.strictEqual(1, '1'));
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: 1,
  expected: '1',
  operator: 'strictEqual'
}

notStrictEqual方法的作用与strictEqual方法的作用相反,用于判断两个值及其数据类型是否不等,Node.js内部使用"!=="操作符进行判断,使用方式如下所示。

js 复制代码
assert.notStrictEqual(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息
js 复制代码
const assert = require('assert');
console.log(assert.notStrictEqual(1, 1));
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: 1,
  expected: 1,
  operator: 'notStrictEqual'
}

3、assert()与ok()

ok方法是一种简洁的判断方法,用于直接判断某个值是否为真,如果为假,则抛出AssertionError异常,使用方式如下所示:

js 复制代码
assert.ok(value, [message])
  • value:断言的值
  • message:可选,自定义异常
js 复制代码
const assert = require('assert');
console.log(assert.ok(1));
console.log(assert.ok(false));
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:3:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

另外,可以使用assert方法来代替assert.ok方法,使用方式如下所示:

js 复制代码
assert(value, [message])
  • value:断言的值
  • message:可选,自定义异常
js 复制代码
const assert = require('assert');
console.log(assert(1));
console.log(assert(false));
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:3:13)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: false,
  expected: true,
  operator: '=='
}

4、deepEqual()与notDeepEqual()

在Node.js中,可以使用deepEqual方法进行深层次的比较,使用方法如下所示:

js 复制代码
assert.deepEqual(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息

比较规则如下:

  1. 如果对两个简单类型的值进行比较(字符串、数值、布尔值、null与undefined),则内部使用"=="操作符进行判断。
  2. 如果对两个数组进行比较,则内部使用"==="操作符进行判断。
  3. 如果对两个对象进行比较,则将它们的属性长度和属性值进行比较。
  4. 如果对两个缓存区对象进行比较,则先比较它们的长度,然后逐字节比较缓存区中的内容。
js 复制代码
const assert = require('assert');
console.log(assert.deepEqual([1, 2, 3], [1, 2, 3]));
console.log(assert.deepEqual({name: 'tom', age: 18}, {name: 'tom', age: 17}));
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:3:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: [Object],
  expected: [Object],
  operator: 'deepEqual'
}

notDeepEqual方法的作用与deepEqual方法相反,它用于深层判断两个值是否不等,比较规则与deepEqual方法使用的比较规则相同,使用方式如下所示。

js 复制代码
assert.notDeepEqual(actual, expected, [message])
  • actual:实际值
  • expected:预期值
  • message:可选,指定自定义异常信息
js 复制代码
const assert = require('assert');
console.log(assert.notDeepEqual([1, 2, 3], [1, 2, 3]));
console.log(assert.notDeepEqual({name: 'tom', age: 18}, {name: 'tom', age: 17}));
js 复制代码
]
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:20)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: true,
  code: 'ERR_ASSERTION',
  actual: [Array],
  expected: [Array],
  operator: 'notDeepEqual'
}

5、throws()与doesNotThrow()

throws方法用于执行一个函数中的代码并判断该函数中是否会抛出一个异常,如果判断结果为真(函数中抛出异常)​,则不抛出AssertionError异常,如果判断为假(函数中不抛出异常)​,则抛出AssertionError异常。

js 复制代码
assert.throws(block, [error], [message])
  • block:一个函数,如果该函数中抛出异常,则不抛出AssertionError异常。如果该函数中不抛出异常,则throws方法抛出AssertionError异常。
  • error:可选,一个返回true或返回false的函数,用于控制是否抛出在第一个参数值函数中指定抛出的异常,如果第二个参数值返回false,则抛出该异常。
  • message:可选,自定义错误信息
js 复制代码
const assert = require('assert');
assert.throws(()=>{
     let i = 1 / 0;
     console.log("I'm an error");
}, ()=>{return false});
js 复制代码
    at Object.<anonymous> (/Users/acton_zhang/前端/vscodeworkspace/node/demo/index.js:2:8)
    at Module._compile (internal/modules/cjs/loader.js:1118:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1138:10)
    at Module.load (internal/modules/cjs/loader.js:982:32)
    at Function.Module._load (internal/modules/cjs/loader.js:875:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47 {
  generatedMessage: false,
  code: 'ERR_ASSERTION',
  actual: undefined,
  expected: [Function (anonymous)],
  operator: 'throws'
}

doesNotThrow方法用于执行一个函数中的代码并判断该函数是否不会抛出一个异常,如果判断为真(函数中不抛出异常)​,则正常执行该函数,如果判断为假(函数中抛出异常)​,则抛出该异常或AssertionError异常(根据doesNotThrow方法中的第二个参数而定)​。

js 复制代码
assert.doesNotThrow(block, [error], [message])
  • block:一个函数,如果该函数中抛出异常,且不指定第二个参数及第三个参数,则抛出该异常
  • error:可选,一个返回true或false的函数,用于控制是抛出在第一个参数值函数中指定抛出的异常还是抛出AssertionError异常,如果第二个参数值返回false,则抛出该异常
  • message:可选,自定义错误信息
js 复制代码
const assert = require('assert');
assert.doesNotThrow(()=>{
     let i = 1 / 0;
     console.log("I'm an error");
}, ()=>{return false});
复制代码
I'm an error

doesNotThrow方法的第二个参数值也可以为正则表达式的验证函数(regex.test函数)​,如果验证结果为假,则抛出第一个参数值函数中指定抛出的异常。

相关推荐
半个落月2 小时前
用 LangChain 连接远程 MCP:从工具发现到多轮调用闭环
人工智能·后端·node.js
星栈独行5 小时前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·程序人生·node.js
徐小超9 小时前
从一句 Hello World 到完整 RAG 系统:一个 AI 知识库的架构选型实录
langchain·node.js·ai编程
雷工笔记20 小时前
如何查看电脑有没有安装node.js及如何安装node.js
node.js
星栈1 天前
Node 框架怎么选?Express、Koa、Egg、NestJS 场景化选型指南
后端·node.js
万敏1 天前
Vue3 全栈实战第三周:组件化开发完整记录 —— Props / Emit / provide-inject / 插槽 / 自定义指令
vue.js·node.js·全栈
Kel1 天前
Node.js 单线程高并发:从内核中断到 JS 回调的完整技术栈
设计模式·架构·node.js
触底反弹2 天前
🔥 保姆级教程|SSE + BFF + 跨域三件套,从零实现 ChatGPT 流式输出(附完整代码)
人工智能·node.js·vite
柒和远方3 天前
V043:BFF 层流式输出:从前端直连到生产级流式网关的架构演进
javascript·架构·node.js
濮水大叔3 天前
在 DTO 中使用 Form Layout 配置复杂表单,支持 Tabs/Groups/Sections
vue.js·typescript·node.js