• fn {Function}
    • error {RegExp|Function|Object|Error}
    • message {string}

    期望 fn 函数抛出错误。

    如果指定,则 error 可以是 [Class]、[RegExp]、验证函数,每个属性将被测试严格的深度相等的验证对象、或每个属性(包括不可枚举的 messagename 属性)将被测试严格的深度相等的错误实例。 使用对象时,还可以在对字符串属性进行验证时使用正则表达式。 请参见下面的示例。

    如果指定 message,则当 fn 调用无法抛出或错误验证失败时,message 将附加到 AssertionError 提供的消息。

    自定义的验证对象/错误实例:

    1. const err = new TypeError('错误值');
    2. err.code = 404;
    3. err.foo = 'bar';
    4. err.info = {
    5. nested: true,
    6. baz: 'text'
    7. };
    8. err.reg = /abc/i;
    9. assert.throws(
    10. () => {
    11. throw err;
    12. },
    13. {
    14. name: 'TypeError',
    15. message: '错误值',
    16. info: {
    17. nested: true,
    18. baz: 'text'
    19. }
    20. // 仅测试验证对象上的属性。
    21. // 使用嵌套对象需要存在所有属性。
    22. // 否则验证将失败。
    23. }
    24. );
    25. // 使用正则表达式验证错误属性:
    26. assert.throws(
    27. () => {
    28. throw err;
    29. },
    30. {
    31. // `name` 和 `message` 属性是字符串,使用正则表达式将匹配字符串。
    32. // 如果失败,则会抛出错误。
    33. name: /^TypeError$/,
    34. message: /错误/,
    35. foo: 'bar',
    36. info: {
    37. nested: true,
    38. // 无法对嵌套属性使用正则表达式!
    39. baz: 'text'
    40. },
    41. // `reg` 属性包含一个正则表达式,
    42. // 并且只有当验证对象包含相同的正则表达式时,
    43. // 它才会通过。
    44. reg: /abc/i
    45. }
    46. );
    47. // 由于 `message` 和 `name` 属性不同而失败:
    48. assert.throws(
    49. () => {
    50. const otherErr = new Error('未找到');
    51. // 将所有可枚举的属性从 `err` 拷贝到 `otherErr`。
    52. for (const [key, value] of Object.entries(err)) {
    53. otherErr[key] = value;
    54. }
    55. throw otherErr;
    56. },
    57. // 当使用错误作为验证对象时,也会检查错误的 `message` 和 `name` 属性。
    58. err
    59. );

    使用构造函数验证 instanceof:

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

    使用 [RegExp] 验证错误消息:

    使用正则表达式在错误对象上运行 .toString,因此也将包含错误名称。

    1. assert.throws(
    2. () => {
    3. throw new Error('错误值');
    4. },
    5. /^Error: 错误值$/
    6. );

    自定义的错误验证函数:

    该函数必须返回 true,以表明已通过所有的内部验证。 否则它将会失败并带上 [AssertionError]。

    1. assert.throws(
    2. () => {
    3. throw new Error('错误值');
    4. },
    5. (err) => {
    6. assert(err instanceof Error);
    7. assert(/value/.test(err));
    8. // 避免从验证函数返回 `true` 以外的任何东西。
    9. // 否则,会不清楚验证的哪一部分失败。
    10. // 应该抛出有关失败的特定验证的错误(如本例所示),并向该错误添加尽可能多的有用的调试信息。
    11. return true;
    12. },
    13. '不是期望的错误'
    14. );

    error 不能是字符串。 如果提供了一个字符串作为第二个参数,则假定 error 被忽略,而字符串将用于 message。 这可能导致容易错过的错误。 使用与抛出的错误消息相同的消息将导致 ERR_AMBIGUOUS_ARGUMENT 错误。 如果使用字符串作为第二个参数,请仔细阅读下面的示例:

    1. function throwingFirst() {
    2. throw new Error('错误一');
    3. }
    4. function throwingSecond() {
    5. throw new Error('错误二');
    6. }
    7. function notThrowing() {}
    8. // 第二个参数是一个字符串,输入函数抛出一个错误。
    9. // 第一种情况不会抛出,因为它与输入函数抛出的错误消息不匹配!
    10. assert.throws(throwingFirst, '错误二');
    11. // 在下一个示例中,传入的消息类似来自错误的消息,
    12. // 并且由于不清楚用户是否打算实际匹配错误消息,
    13. // 因此 Node.js 抛出了 `ERR_AMBIGUOUS_ARGUMENT` 错误。
    14. assert.throws(throwingSecond, '错误二');
    15. // TypeError [ERR_AMBIGUOUS_ARGUMENT]
    16. // 该字符串仅在函数未抛出时使用(作为消息):
    17. assert.throws(notThrowing, '错误二');
    18. // AssertionError [ERR_ASSERTION]: Missing expected exception: 错误二
    19. // 如果要匹配错误消息,请执行以下操作:
    20. // 它不会抛出错误,因为错误消息匹配。
    21. assert.throws(throwingSecond, /错误二$/);
    22. // 如果错误消息不匹配,则抛出 AssertionError。
    23. assert.throws(throwingFirst, /错误二$/);
    24. // AssertionError [ERR_ASSERTION]

    由于令人困惑的表示法,建议不要使用字符串作为第二个参数。 这可能会导致难以发现的错误。