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

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

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

    本文实例讲述了Node.js API详解之 vm模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 vm vm 模块提供了一系列 API 用于在 V8 虚拟机环境中编译和运行代码. JavaScript 代码可以被编译并立即运行,或编译.保存然后再运行. 常见的用法是在沙盒中运行代码.沙盒代码使用不同的V8上下文. const vm = require('vm'); const x = 1; const sandbox = { x: 2 }; vm.createContex

  • Node.js API详解之 readline模块用法详解

    本文实例讲述了Node.js API详解之 readline模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 readline readline 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行. 它可以通过以下方式使用: const readline = require('readline'); readline 模块的基本用法: const readline = require('readline'); const rl = r

  • Node.js API详解之 querystring用法实例分析

    本文实例讲述了Node.js API详解之 querystring用法.分享给大家供大家参考,具体如下: Node.js API详解之 querystring querystring模块提供了一些实用函数,用于解析与格式换URL查询字符串 通过 const querystring = require('querystring'); 的方式引用querystrings模块 目录: querystring.escape(str) querystring.unescape(str) querystri

  • Node.js API详解之 tty功能与用法实例分析

    本文实例讲述了Node.js API详解之 tty功能与用法.分享给大家供大家参考,具体如下: tty 可以理解为终端的意思.tty 模块提供终端相关的接口,用来获取终端的行数列数等. 通过 const tty = require('tty'); 的方式引用 tty 模块 process.stdout.isTTY 说明: 此属性位于 process 模块,用来判断 Node.js 是否运行在一个 TTY 环境中 demo: console.log(process.stdout.isTTY) //

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

    本文实例讲述了Node.js API详解之 timer模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 timer timer 模块暴露了一个全局的 API,用于在某个未来时间段调用调度函数. 因为定时器函数是全局的,所以使用该 API 无需调用 require('timers'). Node.js 中的计时器函数实现了与 Web 浏览器提供的定时器类似的 API, 它使用了一个不同的内部实现,它是基于 Node.js 事件循环构建的. setImmediate(call

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

    本文实例讲述了Node.js API详解之 os模块用法.分享给大家供大家参考,具体如下: os是Node的一个基础模块,提供了一些操作系统相关的属性接口. 通过 const os = require('os'); 的方式引用os模块,我们接着看下os都有哪些功能 说明: 一个字符串常量,定义操作系统相关的行末标志:POSIX 系统上值为\n,Windows下的值为\r\n demo: console.log('abc'+ os.EOL +'123'); //abc //123 os.arch(

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

    本文实例讲述了Node.js API详解之 util模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 util util 模块主要用于支持 Node.js 内部 API 的需求.提供了大部分实用工具. 通过 const util = require('util'); 的方式引用util模块 util.callbackify(original) 说明: original:传递一个 async 函数,或者是一个返回Promise的异步函数. callbackify会返回一个方

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

    本文实例讲述了Node.js API详解之 dgram模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 dgram dgram模块提供了 UDP 数据包 socket 的实现. 使用以下方式引用: const dgram = require('dgram'); dgram.createSocket(options[, callback]) 说明: 创建一个 dgram.Socket 对象. 一旦创建了套接字,调用 socket.bind() 会指示套接字开始监听数据报消息

  • Node.js API详解之 zlib模块用法分析

    本文实例讲述了Node.js API详解之 zlib模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 zlib zlib模块提供通过 Gzip 和 Deflate/Inflate 实现的压缩功能,可以通过这样使用它: const zlib = require('zlib'); 压缩或者解压数据流(例如一个文件)通过zlib流将源数据流传输到目标流中来完成: const gzip = zlib.createGzip(); const fs = require('fs');

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

    本文实例讲述了Node.js API详解之 Error模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 Error Node.js 中运行的应用程序一般会遇到以下四类错误: 1.标准的 JavaScript 错误: EvalError : 当调用 eval() 失败时抛出. SyntaxError : 当 JavaScript 语法错误时抛出. RangeError : 当值不在预期范围内时抛出. ReferenceError : 当使用未定义的变量时抛出. TypeEr

  • Node.js API详解之 string_decoder用法实例分析

    本文实例讲述了Node.js API详解之 string_decoder用法.分享给大家供大家参考,具体如下: string_decoder 模块提供了一个 API,用于把 Buffer 对象解码成字符串. 对于参数末尾不完整的多字节字符,string_decoder会将其保存在内部的buffer中,当再次解码时,补充到参数开头. 通过 const { StringDecoder } = require('string_decoder'); 的方式引用string_decoder模块. 目录:

随机推荐