Node.js Assertion Testing

Assert

Stability: 2 - Stable 稳定

Assert - Node.js 的断言库

在 Node.js 的开发过程中,Assert 绝对是必不可少的模块,本文将会结合官方文档系统地为您介绍一些实用的 API。

assert(value[, message])、assert.ok(value[, message])

这两个 API 的功能是一样的,判断 value 是否为真,如果不为真,则会抛出 AssertionError 类型的错误

const assert = require('assert');

assert.ok(true);
// OK
assert.ok(1);
// OK
assert.ok(false);
// throws "AssertionError: false == true"
assert.ok(0);
// throws "AssertionError: 0 == true"
assert.ok(false, 'it\'s false');
// throws "AssertionError: it's false"
// assert.ok() 可以替换成 assert()

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

  • assert.notEqual(actual, expected[, message]) 如果 actual != expected 为真,则不会抛出错误,否则抛出 AssertionError 类型的错误

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

  • assert.notEqual(actual, expected[, message]) 如果 actual != expected 为真,则不会抛出错误,否则抛出 AssertionError 类型的错误

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

  • assert.strictEqual(actual, expected[, message]) 如果 actual === expected 为真,则不会抛出错误,否则抛出 AssertionError 类型的错误

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

  • assert.notStrictEqual(actual, expected[, message]) 如果 actual !== expected 为真,则不会抛出错误,否则抛出 AssertionError 类型的错误

注意:上面这4个 API 只能判断基本数据类型(数字,字符串等),不能判断复杂数据类型(对象,数组等),否则会得到非预期的结果

const assert = require('assert');

assert.equal(1, 1);
// OK, 1 == 1
assert.equal(1, '1');
// OK, 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.ifError(value)

如果 value 是真,则抛出 value,这个方法经常用作判断回调函数的 error 参数

const fs = require('fs')
const assert = require('assert')
fs.readFile('/etc/passwd', (err, data) => {
  assert.ifError(err)
  // todo
});

assert.fail(actual, expected, message, operator)

抛出一个 AssertionError 错误,如果 message 是真,则错误信息是 message,否则错误信息是 actualoperatorexpected 连接的字符串

const assert = require('assert');
assert.fail(1, 2, undefined, '>');
// AssertionError: 1 > 2
assert.fail(1, 2, 'whoops', '>');
// AssertionError: whoops

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

该 API 通过参数 block 抛出一个错误,用 error 参数进行验证抛出的错误是否符合预期,如果不符合,则会抛出错误,如果抛出错误失败,且指定了参数 message,则会抛出一个错误,错误信息是 messageerror 参数可以是构造函数,正则表达式,和自定义的函数,不能是字符串,否则会出现非预期的结果

const assert = require('assert')

assert.throws(
  () => {
    throw new Error();
  },
  Error
);

assert.throws(
  () => {
    throw new Error('Wrong value');
  },
  /value/
);

assert.throws(
  () => {
    throw new Error('Wrong value');
  },
  function(err) {
    if ((err instanceof Error) && /value/.test(err)) {
      return true;
    }
  },
  'unexpected error'
);

// 没有抛出错误,则会显示 message
assert.throws(
  () => {},
  /test/,
  'throw error failed'
);

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

该 API 是验证参数 block 没有抛出错误的情况,如果抛出了错误,且抛出错误的类型与参数 error 一致,则抛出 AssertionError 错误;如果不一致,则直接把 block 的错误抛出

const assert = require('assert')

// 类型不一样,直接抛出TypeError
assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  SyntaxError
);

// 类型一样,抛出 AssertionError
assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  TypeError
);

// 抛出的 AssertionError 带有 message 信息
assert.doesNotThrow(
  () => {
    throw new TypeError('Wrong value');
  },
  TypeError,
  'Whoops'
);
// Throws: AssertionError: Got unwanted exception (TypeError). Whoops

// 不会抛出错误
assert.doesNotThrow(
  () => {},
  TypeError
);

assert.deepEqual(actual, expected[, message])、assert.notDeepEqual(actual, expected[, message])

assert.deepEqual(actual, expected[, message]) 使用 == 比较参数 actualexpected 的属性值,如果为真,则不会抛出错误,否则,抛出 AssertionError 错误。其功能与 assert.notDeepEqual(actual, expected[, message]) 相反

assert.deepStrictEqual(actual, expected[, message])、assert.notDeepStrictEqual(actual, expected[, message])

assert.deepStrictEqual(actual, expected[, message]) 使用 === 比较参数 actualexpected 的属性值,如果为真,则不会抛出错误,否则,抛出 AssertionError 错误。其功能与 assert.notDeepEqual(actual, expected[, message]) 相反
注意:上面4个 API 只会判定可枚举属性,对象的原型 prototypes, 符号attached symbols,和不可枚举属性无法判定

const assert = require('assert');

// Error的属性是不可枚举的,所以不会抛出错误
assert.deepEqual(Error('a'), Error('b'));

const obj1 = {
  a: {
    b: 1
  }
};
const obj2 = {
  a: {
    b: 2
  }
};
const obj3 = {
  a: {
    b: 1
  }
};
const obj4 = Object.create(obj1);

assert.deepEqual(obj1, obj1);
// OK, object is equal to itself

assert.deepEqual(obj1, obj2);
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
// values of b are different

assert.deepEqual(obj1, obj3);
// OK, objects are equal

assert.deepEqual(obj1, obj4);
// AssertionError: { a: { b: 1 } } deepEqual {}
// Prototypes are ignored

简书作者 小菜荔枝原创 转载请联系作者获得授权

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • assert assert.deepEqual()和assert.equal()有点区别! 一开时我们需要这么做:...
    zhangtaiwei阅读 620评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,278评论 0 6
  • assert 模块 提供了断言测试的函数,用于测试不变式。一直觉得最直观的学习模式是首先抛出demo,然后通过对d...
    七_五阅读 974评论 0 1
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,670评论 0 9