fn{Function}error{RegExp|Function|Object|Error}message{string}
期望 fn 函数抛出错误。
如果指定,则 error 可以是 [Class]、[RegExp]、验证函数,每个属性将被测试严格的深度相等的验证对象、或每个属性(包括不可枚举的 message 和 name 属性)将被测试严格的深度相等的错误实例。
使用对象时,还可以在对字符串属性进行验证时使用正则表达式。
请参见下面的示例。
如果指定 message,则当 fn 调用无法抛出或错误验证失败时,message 将附加到 AssertionError 提供的消息。
自定义的验证对象/错误实例:
const err = new TypeError('错误值');err.code = 404;err.foo = 'bar';err.info = {nested: true,baz: 'text'};err.reg = /abc/i;assert.throws(() => {throw err;},{name: 'TypeError',message: '错误值',info: {nested: true,baz: 'text'}// 仅测试验证对象上的属性。// 使用嵌套对象需要存在所有属性。// 否则验证将失败。});// 使用正则表达式验证错误属性:assert.throws(() => {throw err;},{// `name` 和 `message` 属性是字符串,使用正则表达式将匹配字符串。// 如果失败,则会抛出错误。name: /^TypeError$/,message: /错误/,foo: 'bar',info: {nested: true,// 无法对嵌套属性使用正则表达式!baz: 'text'},// `reg` 属性包含一个正则表达式,// 并且只有当验证对象包含相同的正则表达式时,// 它才会通过。reg: /abc/i});// 由于 `message` 和 `name` 属性不同而失败:assert.throws(() => {const otherErr = new Error('未找到');// 将所有可枚举的属性从 `err` 拷贝到 `otherErr`。for (const [key, value] of Object.entries(err)) {otherErr[key] = value;}throw otherErr;},// 当使用错误作为验证对象时,也会检查错误的 `message` 和 `name` 属性。err);
使用构造函数验证 instanceof:
assert.throws(() => {throw new Error('错误值');},Error);
使用 [RegExp] 验证错误消息:
使用正则表达式在错误对象上运行 .toString,因此也将包含错误名称。
assert.throws(() => {throw new Error('错误值');},/^Error: 错误值$/);
自定义的错误验证函数:
该函数必须返回 true,以表明已通过所有的内部验证。
否则它将会失败并带上 [AssertionError]。
assert.throws(() => {throw new Error('错误值');},(err) => {assert(err instanceof Error);assert(/value/.test(err));// 避免从验证函数返回 `true` 以外的任何东西。// 否则,会不清楚验证的哪一部分失败。// 应该抛出有关失败的特定验证的错误(如本例所示),并向该错误添加尽可能多的有用的调试信息。return true;},'不是期望的错误');
error 不能是字符串。
如果提供了一个字符串作为第二个参数,则假定 error 被忽略,而字符串将用于 message。
这可能导致容易错过的错误。
使用与抛出的错误消息相同的消息将导致 ERR_AMBIGUOUS_ARGUMENT 错误。
如果使用字符串作为第二个参数,请仔细阅读下面的示例:
function throwingFirst() {throw new Error('错误一');}function throwingSecond() {throw new Error('错误二');}function notThrowing() {}// 第二个参数是一个字符串,输入函数抛出一个错误。// 第一种情况不会抛出,因为它与输入函数抛出的错误消息不匹配!assert.throws(throwingFirst, '错误二');// 在下一个示例中,传入的消息类似来自错误的消息,// 并且由于不清楚用户是否打算实际匹配错误消息,// 因此 Node.js 抛出了 `ERR_AMBIGUOUS_ARGUMENT` 错误。assert.throws(throwingSecond, '错误二');// TypeError [ERR_AMBIGUOUS_ARGUMENT]// 该字符串仅在函数未抛出时使用(作为消息):assert.throws(notThrowing, '错误二');// AssertionError [ERR_ASSERTION]: Missing expected exception: 错误二// 如果要匹配错误消息,请执行以下操作:// 它不会抛出错误,因为错误消息匹配。assert.throws(throwingSecond, /错误二$/);// 如果错误消息不匹配,则抛出 AssertionError。assert.throws(throwingFirst, /错误二$/);// AssertionError [ERR_ASSERTION]
由于令人困惑的表示法,建议不要使用字符串作为第二个参数。 这可能会导致难以发现的错误。
