1. // assertion [əˈsɜːʃn] assert [əˈsɜː]
    2. // http://nodejs.cn/api/assert.html 当前参考版本 node v12.13.1
    3. /*
    4. // assert 模块抛出的所有错误都将是 AssertionError 类的实例。
    5. new assert.AssertionError(options: {
    6. message: string; // 如果提供,则将错误消息设置为此值。
    7. actual: any; // 错误实例上的 actual 属性将包含此值。
    8. expected: any; // 错误实例上的 expected 属性将包含此值。
    9. operator: string; // 错误实例上的 operator 属性将包含此值。
    10. stackStartFn: Function; // 如果提供,则生成的堆栈跟踪将移除所有帧直到提供的函数。
    11. })
    12. assert.deepEqual(actual: any, expected: any[, message:string| Error]); 已废弃,应改为 assert.deepStrictEqual()
    13. // 深比较
    14. // 使用抽象的相等性比较来比较原始值。
    15. // 对象的类型标签应该相同。
    16. // 只考虑可枚举的自身属性。
    17. // 始终比较 Error 的名称和消息,即使这些不是可枚举的属性。
    18. // 对象封装器作为对象和解封装后的值都进行比较。
    19. // Object 属性的比较是无序的。
    20. // Map 键名与 Set 子项的比较是无序的。
    21. // 当两边的值不相同或遇到循环引用时,递归停止。
    22. // 不测试对象的 [[Prototype]]。
    23. // 可枚举的自身 Symbol 属性也会比较。
    24. // WeakMap 和 WeakSet 的比较不依赖于它们的值。
    25. // 以下示例不会抛出 AssertionError,因为抽象的相等性比较(==)会将原始类型视为相等。
    26. // 不会抛出 AssertionError。
    27. assert.deepEqual('+00000000', false);
    28. const obj1 = {a: {b: 1}}; const obj2 = {a: {b: 1}}; const obj3 = Object.create(obj1);
    29. assert.deepEqual(obj1, obj2); // 通过
    30. // 原型会被忽略:
    31. assert.deepEqual(obj1, obj4);
    32. // 抛出 AssertionError: { a: { b: 1 } } deepEqual {}
    33. assert.notDeepEqual(actual, expected[, message]) 已废弃 与assert.deepEqual结果相反 应改为 assert.notDeepStrictEqual(actual, expected[, message])
    34. assert.strictEqual(ctual: any, expected: any[, message:string| Error]) (assert.equal 已废弃, assert.notEqual 已废弃)
    35. // 浅比较
    36. assert.notStrictEqual(actual, expected[, message]) 与assert.strictEqual结果相反
    37. assert(value: any[, message:string|Error])
    38. // assert.ok() 的别名。
    39. 检测值是否为真值
    40. assert(0) 抛出异常
    41. assert(typeof 123 === 'string') 抛出异常
    42. assert.ifError(value);
    43. 如果 value 不为 undefined 或 null,则抛出 value。
    44. assert.ifError(0); 抛出异常
    45. assert.ifError(undefined);
    46. assert.ifError(null);
    47. */
    48. // const assert = require("assert"); // 普通模式(Legacy | 遗留模式)
    49. /*
    50. 请注意,如果使用上面那条语句的话,抽象的相等性比较可能会导致意外的结果。 特别是对于 assert.deepEqual(),其中的比较规则是松散的:
    51. 使用 Legacy Mode 会使下面的语句不抛出错误
    52. assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]);
    53. 遗留模式在以下方法中使用抽象的相等性比较:
    54. assert.deepEqual()
    55. assert.equal()
    56. assert.notDeepEqual()
    57. assert.notEqual()
    58. */
    59. const assert = require('assert').strict; // 使用严格模式
    60. // 生成 AssertionError 以便稍后比较错误的消息:
    61. const { message } = new assert.AssertionError({
    62. // message: '666', // 写上 message就使用写上的值,不写使用预设
    63. actual: 1,
    64. expected: 2,
    65. operator: 'strictEqual'
    66. });
    67. /*
    68. // console.log(`测试开始`, message);
    69. // Input A expected to strictly equal input B: 属于A应该严格等于输入B
    70. // 下面的内容是 console.log(`测试开始`, message); 的输出内容
    71. 测试开始 Input A expected to strictly equal input B:
    72. + expected - actual
    73. - 1
    74. + 2
    75. */
    76. console.log(`测试开始========================================`);
    77. console.log(` `)
    78. try {
    79. assert.deepEqual([[[1, 2, 3]], 4, 5], [[[1, 2, '3']], 4, 5]);
    80. } catch(err) {
    81. console.log(err);
    82. // Input A expected to strictly deep-equal input B: 输入A应严格地深等于输入B:
    83. // 下面是console.log(err);的内容
    84. /*
    85. assert.js:85
    86. throw new AssertionError(obj);
    87. ^
    88. AssertionError [ERR_ASSERTION]: Input A expected to strictly deep-equal input B:
    89. + expected - actual ... Lines skipped
    90. [
    91. [
    92. ...
    93. 2,
    94. - 3
    95. + '3'
    96. ]
    97. ...
    98. 5
    99. ]
    100. at Object.<anonymous> (/Users/lijunyang/project/sinon-demo/assert.js:42:8)
    101. at Module._compile (internal/modules/cjs/loader.js:689:30)
    102. at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    103. at Module.load (internal/modules/cjs/loader.js:599:32)
    104. at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    105. at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    106. at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    107. at startup (internal/bootstrap/node.js:282:19)
    108. at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
    109. */
    110. }
    111. try {
    112. assert.strictEqual(1, 2); // 断言失败会抛出异常
    113. } catch (err) {
    114. // console.log(err);
    115. /* 下面是console.log(err)的输出内容
    116. { AssertionError [ERR_ASSERTION]: Input A expected to strictly equal input B:
    117. + expected - actual
    118. - 1
    119. + 2
    120. at Object.<anonymous> (/Users/lijunyang/project/sinon-demo/assert.js:39:10)
    121. at Module._compile (internal/modules/cjs/loader.js:689:30)
    122. at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    123. at Module.load (internal/modules/cjs/loader.js:599:32)
    124. at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    125. at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    126. at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    127. at startup (internal/bootstrap/node.js:282:19)
    128. at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
    129. generatedMessage: true,
    130. name: 'AssertionError [ERR_ASSERTION]',
    131. code: 'ERR_ASSERTION',
    132. actual: 1,
    133. expected: 2,
    134. operator: 'strictEqual' }
    135. */
    136. try {
    137. assert(err instanceof assert.AssertionError); // 断言成功没有任何返回,没有任何提示
    138. /*
    139. assert.strictEqual(1, 2); // 断言失败会抛出异常 // 断言失败就不会执行后面的语句了
    140. console.log('失败1')
    141. assert.strictEqual(1, 2); // 断言失败会抛出异常
    142. console.log('失败2')
    143. */
    144. assert.strictEqual(err.message, message);
    145. assert.strictEqual(err.actual, 1);
    146. assert.strictEqual(err.expected, 2);
    147. assert.strictEqual(err.code, 'ERR_ASSERTION');
    148. assert.strictEqual(err.operator, 'strictEqual');
    149. assert.strictEqual(err.generatedMessage, true);
    150. assert.strictEqual(err.name, 'AssertionError [ERR_ASSERTION]');
    151. } catch (err) {
    152. console.log(`err`, err);
    153. }
    154. }
    155. console.log(` `)
    156. console.log(`测试结束========================================`);
    1. /*
    2. assert.throws(fn[, error][, message])
    3. // 检测fn是否抛出异常
    4. 如果指定,则 error 可以是 Class、RegExp、验证函数,每个属性将被测试严格的深度相等的验证对象、或每个属性(包括不可枚举的 message 和 name 属性)将被测试严格的深度相等的错误实例。 使用对象时,还可以在对字符串属性进行验证时使用正则表达式。 请参阅下面的示例。
    5. 如果指定 message,则当 fn 调用无法抛出或错误验证失败时, message 将附加到 AssertionError 提供的消息。
    6. assert.doesNotThrow(fn[, error: Error | <RegExp> | <Function>][, message])
    7. 断言 fn 函数不会抛出错误。
    8. */
    9. const assert = require('assert').strict;
    10. const err = new TypeError('错误值');
    11. err.code = 404;
    12. err.foo = 'bar';
    13. err.info = {
    14. nested: true,
    15. baz: 'text'
    16. };
    17. err.reg = /abc/i;
    18. // err.info.a = 2; // 使用嵌套对象需要存在所有属性。
    19. // 当上一条语句注释时,下面的assert通过,不然不通过
    20. assert.throws(
    21. () => {
    22. throw err;
    23. },
    24. { // 这个是验证对象
    25. name: 'TypeError',
    26. message: '错误值',
    27. info: {
    28. nested: true,
    29. baz: 'text',
    30. }
    31. // 仅测试验证对象上的属性。
    32. // 使用嵌套对象需要存在所有属性。
    33. // 否则验证将失败。
    34. }
    35. );
    36. // 使用正则表达式验证错误属性:
    37. assert.throws(
    38. () => {
    39. throw err;
    40. },
    41. {
    42. // `name` 和 `message` 属性是字符串,使用正则表达式将匹配字符串。
    43. // 如果失败,则会抛出错误。
    44. name: /^TypeError$/,
    45. message: /错误/,
    46. foo: 'bar',
    47. info: {
    48. nested: true,
    49. // 无法对嵌套属性使用正则表达式!
    50. baz: 'text'
    51. },
    52. // `reg` 属性包含一个正则表达式,
    53. // 并且只有当验证对象包含相同的正则表达式时,
    54. // 它才会通过。
    55. reg: /abc/i
    56. }
    57. );
    58. try {
    59. assert.throws(
    60. () => {
    61. const otherErr = new Error('未找到');
    62. otherErr.code = 404;
    63. throw otherErr;
    64. },
    65. err // 测试 `message`、 `name` 和 `code`。
    66. );
    67. } catch (err) {
    68. console.log(err);
    69. }
    70. // 由于 `message` 和 `name` 属性不同而失败:
    71. /* 下面是上一条语句的输出内容
    72. AssertionError [ERR_ASSERTION]: Input A expected to strictly deep-equal input B:
    73. + expected - actual
    74. Comparison {
    75. code: 404,
    76. - message: '未找到',
    77. - name: 'Error'
    78. + foo: 'bar',
    79. + info: {
    80. + baz: 'text',
    81. + nested: true
    82. + },
    83. + message: '错误值',
    84. + name: 'TypeError',
    85. + reg: /abc/i
    86. }
    87. at Object.<anonymous> (/Users/lijunyang/project/sinon-demo/assert2.js:62:8)
    88. at Module._compile (internal/modules/cjs/loader.js:689:30)
    89. at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    90. at Module.load (internal/modules/cjs/loader.js:599:32)
    91. at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    92. at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    93. at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    94. at startup (internal/bootstrap/node.js:282:19)
    95. at bootstrapNodeJSCore (internal/bootstrap/node.js:743:3)
    96. */
    97. // 使用构造函数验证 instanceof: 下面这条通过
    98. assert.throws(
    99. () => {
    100. throw new Error('错误值');
    101. },
    102. Error
    103. );
    104. // 使用 RegExp 验证错误消息: 使用正则表达式在错误对象上运行 .toString,因此也将包含错误名称。
    105. assert.throws(
    106. () => {
    107. const error = new Error('错误值');
    108. // console.log(error.toString()); // 返回 "Error: 错误值"
    109. throw error;
    110. },
    111. /^Error: 错误值$/
    112. );
    113. console.log("自定义测的错误验证函数=================")
    114. console.log(` `);
    115. // 自定义的错误验证函数:
    116. assert.throws(
    117. () => {
    118. // 如果指定 message,则当 fn 调用无法抛出或错误验证失败时, message 将附加到 AssertionError 提供的消息。
    119. // return; // 此时没有抛出异常,错误验证失败
    120. // 上一条语句如果未注释的话,则抛出异常,异常message为 "不是期望的错误"
    121. throw new Error('错误值');
    122. },
    123. (err) => {
    124. assert(err instanceof Error);
    125. // assert(/value/.test(err)); // 这里会抛出异常,因为正则不匹配
    126. return false;
    127. // 除了 `true` 之外,不建议从验证函数返回任何内容。
    128. // 这样做会导致再次抛出捕获的错误。
    129. // 这通常不是理想的结果。
    130. // 抛出有关失败的特定验证的错误(如本例所示)。
    131. return true;
    132. },
    133. '不是期望的错误'
    134. );
    1. /*
    2. assert.rejects(asyncFn[, error][, message])
    3. 除了等待的异步性质之外,完成行为与 assert.throws() 完全相同。
    4. assert.doesNotReject(asyncFn[, error][, message])
    5. 与rejects相反
    6. assert.fail([message: string | message]);
    7. 使用提供的错误消息或默认错误消息抛出 AssertionError。 如果 message 参数是 Error 的实例,则它将被抛出而不是 AssertionError。
    8. */
    9. const assert = require('assert').strict;
    10. assert.rejects(
    11. async () => {
    12. throw new TypeError('错误值');
    13. },
    14. {
    15. name: 'TypeError',
    16. message: '错误值'
    17. }
    18. );
    19. assert.rejects(
    20. Promise.reject(new Error('错误值1')),
    21. {
    22. name: 'TypeError',
    23. message: '错误值'
    24. }
    25. ).then((res) => {
    26. console.log('res', res);
    27. },(err) => {
    28. console.log('err', err); // 此时抛出异常
    29. });
    30. try {
    31. assert.fail("自定义错误消息A");
    32. } catch (err) {
    33. console.log(err);
    34. }
    35. try {
    36. assert.fail(new Error('自定义错误消息B'));
    37. } catch (err) {
    38. console.log(err);
    39. }