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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

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

友情链接更多精彩内容