断言

assert 模块提供了一系列的测试接口。这些接口的设计初衷是服务于 Node.js 的开发和测试,现在也可以通过 require('assert') 在 Node.js 开发的应用中使用。不过有一点要记住,assert 模块不是一个测试框架,不建议用作通用的断言调试库。

当前 assert 模块的 API 处于锁定状态,这意味着该模块将不再添加新接口,也不会再修改既有的接口规范。

assert(value[, message])

等同于 assert.ok():

  1. const assert = require('assert')
  2. // 参数值 == true,无输出
  3. assert(true)
  4. assert(1)
  5. // 参数值 != false,抛出错误
  6. assert(0)
  7. // => AssertionError: 0 == true
  8. assert(false, "it's false")
  9. // => AssertionError: it's false

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

判断参数 actualexpected 是否相等,使用 == 比较原始值(primitive value)。

deepEqual() 只会比较对象的自有、可枚举属性,不会对其他属性进行比较,所以在某些情况下结果会出人意料,比如在下面的示例中就不会抛出 AssertionError,这是因为 Error 对象的属性不是可枚举属性:

  1. // WARNING: This does not throw an AssertionError!
  2. assert.deepEqual(Error('a'), Error('b'));

方法名中的 Deep 一词意指会对传入的两个对象进行深度比较,包括对对象子级属性的比较:

  1. const assert = require('assert');
  2. const obj1 = {
  3. a: {
  4. b: 1
  5. }
  6. };
  7. const obj2 = {
  8. a: {
  9. b: 2
  10. }
  11. };
  12. const obj3 = {
  13. a: {
  14. b: 1
  15. }
  16. }
  17. const obj4 = Object.create(obj1);
  18. assert.deepEqual(obj1, obj1);
  19. // OK, object is equal to itself
  20. assert.deepEqual(obj1, obj2);
  21. // AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
  22. // values of b are different
  23. assert.deepEqual(obj1, obj3);
  24. // OK, objects are equal
  25. assert.deepEqual(obj1, obj4);
  26. // AssertionError: { a: { b: 1 } } deepEqual {}
  27. // 原型继承而来的属性不计入比较范围

如果 actual 和 expected 不相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

assert.deepEqual() 的作用基本相同,两者的区别在于,assert.deepStrictEqual() 使用 === 判断原始值是否相等:

  1. const assert = require('assert');
  2. assert.deepEqual({a:1}, {a:'1'});
  3. // OK, because 1 == '1'
  4. assert.deepStrictEqual({a:1}, {a:'1'});
  5. // AssertionError: { a: 1 } deepStrictEqual { a: '1' }
  6. // because 1 !== '1' using strict equality

如果 actual 和 expected 不相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

assert.doesNotThrow() 期望传入的 block 函数不会抛出错误,更多信息请查看 assert.thorws()

调用 assert.doesNotThrow() 时,会立即执行 block 函数。

如果 block 函数抛出了错误,且错误类型与 error 参数指定的类型相符,就会抛出 AssertionError 错误;如果 block 函数抛出的错误类型与 error 参数指定的类型不符,或者未传入可选参数 error,则错误会被传递给函数的调用者。

由于传入的 error 参数为 SyntaxErrorblock 函数的错误不匹配,所以下面的示例代码将会抛出 block 函数产生的 TypeError

  1. assert.doesNotThrow(
  2. () => {
  3. throw new TypeError("Wrong Type");
  4. },
  5. SyntaxError
  6. );

如果 error 参数指定的错误与 block 函数抛出的错误匹配,则抛出 AssertionError

  1. assert.doesNotThrow(
  2. () => {
  3. throw new TypeError("Wrong Type");
  4. },
  5. TypeError
  6. );

如果提供了可选参数 message 字符串,那么该字符串信息会被附加到 AssertionError 信息之后:

  1. assert.doesNotThrow(
  2. () => {
  3. throw new TypeError('Wrong value');
  4. },
  5. TypeError,
  6. 'Whoops'
  7. );
  8. // Throws: AssertionError: Got unwanted exception (TypeError). Whoops

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

使用 == 比较 actual 参数和 expected 参数是否相等,如果参数是原始值,则比较值是否相等;如果参数是引用值,则比较内存地址是否相等:

  1. const assert = require('assert');
  2. assert.equal(1, 1);
  3. // OK, 1 == 1
  4. assert.equal(1, '1');
  5. // OK, 1 == '1'
  6. assert.equal(1, 2);
  7. // AssertionError: 1 == 2
  8. assert.equal({a: {b: 1}}, {a: {b: 1}});
  9. // AssertionError: { a: { b: 1 } } == { a: { b: 1 } }

如果 actual 和 expected 不相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

抛出 AssertionError。如果参数 message == undefined,则错误信息为 actual #{operator} expected;如果参数 message != undefined,则错误信息为参数 message

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

assert.ifError(value)

如果 value 为真值(译者注:真值意指 !!value === true),则抛出 value,这对于测试回调函数中的 error 参数很有用:

  1. const assert = require('assert');
  2. assert.ifError(0); // OK
  3. assert.ifError(1); // Throws 1
  4. assert.ifError('error') // Throws 'error'
  5. assert.ifError(new Error()); // Throws Error

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

assert.deepEqual() 的功能相反,测试 actual 参数和 expected 参数是否不相等:

  1. const assert = require('assert');
  2. const obj1 = {
  3. a: {
  4. b: 1
  5. }
  6. };
  7. const obj2 = {
  8. a: {
  9. b: 2
  10. }
  11. };
  12. const obj3 = {
  13. a: {
  14. b: 1
  15. }
  16. }
  17. const obj4 = Object.create(obj1);
  18. assert.notDeepEqual(obj1, obj1);
  19. // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
  20. assert.notDeepEqual(obj1, obj2);
  21. // OK, obj1 and obj2 are not deeply equal
  22. assert.notDeepEqual(obj1, obj3);
  23. // AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
  24. assert.notDeepEqual(obj1, obj4);
  25. // OK, obj1 and obj2 are not deeply equal

如果 actual 和 expected 相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

assert.notDeepStrictEqual() 的功能相反,测试 actual 参数和 expected 参数是否不相等:

  1. const assert = require('assert');
  2. assert.notDeepEqual({a:1}, {a:'1'});
  3. // AssertionError: { a: 1 } notDeepEqual { a: '1' }
  4. assert.notDeepStrictEqual({a:1}, {a:'1'});
  5. // OK

如果 actual 和 expected 相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

使用 != 比较 actual 参数和 expected 参数是否不相等,如果参数是原始值,则比较值是否不相等;如果参数是引用值,则比较内存地址是否不相等:

  1. const assert = require('assert');
  2. assert.notEqual(1, 2);
  3. // OK
  4. assert.notEqual(1, 1);
  5. // AssertionError: 1 != 1
  6. assert.notEqual(1, '1');
  7. // AssertionError: 1 != '1'

如果 actual 和 expected 相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

使用 !== 比较 actual 参数和 expected 参数是否不相等:

  1. const assert = require('assert');
  2. assert.notStrictEqual(1, 2);
  3. // OK
  4. assert.notStrictEqual(1, 1);
  5. // AssertionError: 1 != 1
  6. assert.notStrictEqual(1, '1');
  7. // OK

如果 actual 和 expected 相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

assert.ok(value[, message])

测试 value 是否为真值,等同于 assert.equal(!!value, true, message):

  1. const assert = require('assert');
  2. assert.ok(true);
  3. // OK
  4. assert.ok(1);
  5. // OK
  6. assert.ok(false);
  7. // throws "AssertionError: false == true"
  8. assert.ok(0);
  9. // throws "AssertionError: 0 == true"
  10. assert.ok(false, 'it\'s false');
  11. // throws "AssertionError: it's false"

如果 value 不为真值,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

使用 === 比较 actual 参数和 expected 参数是否相等:

  1. const assert = require('assert');
  2. assert.strictEqual(1, 2);
  3. // AssertionError: 1 === 2
  4. assert.strictEqual(1, 1);
  5. // OK
  6. assert.strictEqual(1, '1');
  7. // AssertionError: 1 === '1'

如果 actual 和 expected 不相等,则抛出 AssertionError 错误和 message 错误信息。这里的 message 参数为可选字符串参数,如果未传入该参数,系统自动分配默认的错误信息。

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

assert.throws() 期望传入的 block 函数会抛出错误(译者注:如果 block 函数抛出错误,assert.throws() 无返回值,表示正常;如果未抛出错误,则 assert.throws() 抛出 AssertionError 错误),可选参数 error 可以是构造函数、正则表达式和自定义的检验函数。

使用构造函数校验错误实例:

  1. assert.throws(
  2. () => {
  3. throw new Error('Wrong value');
  4. },
  5. Error
  6. );

使用正则表达式校验错误信息:

  1. assert.throws(
  2. () => {
  3. throw new Error('Wrong value');
  4. },
  5. /value/
  6. );

使用自定义函数校验错误实例和错误信息:

  1. assert.throws(
  2. () => {
  3. throw new Error('Wrong value');
  4. },
  5. function(err) {
  6. if ( (err instanceof Error) && /value/.test(err) ) {
  7. return true;
  8. }
  9. },
  10. 'unexpected error'
  11. );