• Node.js Video Tutorials

Node.js - assert.throws() 函数



assert 模块提供了一组断言函数,用于验证不变式。Node.js 的 assert.throws() 函数是 Node.js assert 模块的内置函数。

Node.js assert.throws() 函数期望传入的函数抛出一个错误。该函数将接收一个作为输入的函数,该函数预计会抛出错误。

除了此参数外,此函数还接受两个可选参数:一个包含有关错误性质的信息的 Error 对象,以及一个用于调试的消息,以及与错误相关的其他数据。

此方法允许开发人员根据需要轻松创建具有特定消息和上下文的自定义错误。throws() 方法还提供堆栈跟踪信息,使调试代码错误变得更容易。

语法

以下是 Node.js assert.throws() 函数 的语法:

assert.throws(fn[, error][, message]);

参数

此函数接受三个参数。下面描述了这些参数。

  • fn − (必填) 此参数保存一个函数 fn,并期望该函数抛出一个错误。

  • error − (可选) 此参数可以是 RegExp验证函数对象Error(错误实例)。

  • message − (可选) 可以将字符串或 Error 类型作为输入传递给此参数。

返回值

如果函数 fn 抛出错误,则 assert.throws() 函数将返回一个对象类型的 AssertionError。

示例

在示例中,我们将一个包含错误消息的函数传递给第一个参数。我们将 RegExp 传递给第二个参数,该参数应与函数内部的错误消息匹配。

const assert = require('assert');
function func1() {
   assert.throws(() => { func2(); }, /TypeError: Error happening.../);
}

function func2() {
   throw new TypeError('Error ...');
}

func1();

输出

由于 RegExp 与消息不匹配,因此我们将测试的函数将向输出抛出一个带有特定消息的错误。

assert.js:578
   throw actual;
   ^
   
TypeError: Error ...
   at func2 (/home/cg/root/639c3f570123e/main.js:8:9)
   at assert.throws (/home/cg/root/639c3f570123e/main.js:4:25)
   at getActual (assert.js:497:5)
   at Function.throws (assert.js:608:24)
   at func1 (/home/cg/root/639c3f570123e/main.js:4:10)
   at Object.<anonymous> (/home/cg/root/639c3f570123e/main.js:11:1)
   at Module._compile (internal/modules/cjs/loader.js:702:30)
   at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
   at Module.load (internal/modules/cjs/loader.js:612:32)at tryModuleLoad (internal/modules/cjs/loader.js:551:12)

示例

在以下示例中,我们将一个包含错误消息的函数传递给第一个参数。然后我们将 RegExp 传递给第二个参数,该参数应与函数内部的错误消息匹配。

const assert = require('assert');
function func1() {
   assert.throws(() => { func2(); }, /TypeError: Lannisters pay their debts.../);
}

function func2() {
   throw new TypeError('Lannisters pay their debts...');
}

func1();

输出

由于 RegExp 与消息匹配,因此我们将测试的函数不会向输出抛出错误。

// Returns nothing

注意 − 函数的第二个参数 error 不能是字符串。如果将字符串作为 error 传递,则假定省略了 error,并且该字符串将用于函数的 message 参数。如果使用的消息与抛出的错误消息相同,则会生成 ERR AMBIGUOUS ARGUMENT 错误。

如果将字符串用作第二个参数,请仔细查看以下示例:

示例

在以下示例中:

  • 我们创建了三个包含错误消息的函数。

  • 然后我们将特定函数作为第一个参数传递给 assert.throws() 函数,并将字符串作为第二个参数传递。

const assert = require('assert');
function func1() {
   throw new Error('one');
};

function func2() {
   throw new Error('two');
};

function funcNotThrwoing() {};

assert.throws(() => {func2(); }, 'two');

输出

由于不清楚用户是否打算将字符串与错误消息匹配。该函数将抛出一个 `ERR_AMBIGUOUS_ARGUMENT` 错误。

assert.js:547
   throw new ERR_AMBIGUOUS_ARGUMENT(
   ^
   
TypeError [ERR_AMBIGUOUS_ARGUMENT]: The "error/message" argument is ambiguous. The error message "two" is identical to the message.
   at expectsError (assert.js:547:15)
   at Function.throws (assert.js:608:3)
   at Object.<anonymous> (/home/cg/root/639c3f570123e/main.js:13:8)
   at Module._compile (internal/modules/cjs/loader.js:702:30)
   at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)at Module.load (internal/modules/cjs/loader.js:612:32)
   at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
   at Function.Module._load (internal/modules/cjs/loader.js:543:3)
   at Function.Module.runMain (internal/modules/cjs/loader.js:744:10)
   at startup (internal/bootstrap/node.js:238:19)

示例

在以下示例中:

  • 我们创建了三个包含错误消息的函数。

  • 然后我们将特定函数作为第一个参数传递给 assert.throws() 函数,并将字符串作为第二个参数传递。

const assert = require('assert');
function func1() {
   throw new Error('one');
};

function func2() {
   throw new Error('two');
};

function funcNotThrwoing() {};

assert.throws(() => {func2(); }, 'one');

输出

输入函数不会抛出错误,因为字符串与输入函数中的错误消息不匹配。

// Returns nothing

示例

在此示例中,目的是让字符串与错误消息匹配。

const assert = require('assert');
function func1() {
   throw new Error('one');
};

function func2() {
   throw new Error('two');
};

function funcNotThrwoing() {};

assert.throws(() => {func1(); }, /one$/);

输出

该函数不会抛出任何错误,因为 RegExp 与输入函数中存在的错误消息匹配。

// Returns nothing

示例

在此示例中,目的是让字符串与错误消息匹配。

const assert = require('assert');
function func1() {
   throw new Error('one');
};

function func2() {
   throw new Error('two');
};

function funcNotThrwoing() {};
assert.throws(() => {func2(); }, /one$/);

输出

该函数抛出错误,因为 RegExp 与输入函数中存在的错误消息不匹配。

node main.js
assert.js:578
   throw actual;
   ^
   
Error: two
   at func2 (/home/cg/root/639c44d7022a4/main.js:8:9)
   at assert.throws (/home/cg/root/639c44d7022a4/main.js:13:22)
   at getActual (assert.js:497:5)
   at Function.throws (assert.js:608:24)
   at Object.<anonymous> (/home/cg/root/639c44d7022a4/main.js:13:8)
   at Module._compile (internal/modules/cjs/loader.js:702:30)
   at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
   at Module.load (internal/modules/cjs/loader.js:612:32)
   at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
   at Function.Module._load (internal/modules/cjs/loader.js:543:3)

示例

由于输入函数没有抛出任何错误,因为它没有任何错误消息。

const assert = require('assert');
function func1() {
   throw new Error('one');
};

function func2() {
   throw new Error('two');
};

function funcNotThrwoing() {};

assert.throws(() => {funcNotThrwoing(); }, /one$/);

输出

正如我们在下面的输出中看到的,该函数抛出一个带有“缺少预期异常”消息的错误。

assert.js:79
   throw new AssertionError(obj);
   ^
   
AssertionError [ERR_ASSERTION]: Missing expected exception.
   at Object.<anonymous> (/home/cg/root/639c44d7022a4/main.js:13:8)
   at Module._compile (internal/modules/cjs/loader.js:702:30)
   at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10)
   at Module.load (internal/modules/cjs/loader.js:612:32)
   at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
   at Function.Module._load (internal/modules/cjs/loader.js:543:3)
   at Function.Module.runMain (internal/modules/cjs/loader.js:744:10)
   at startup (internal/bootstrap/node.js:238:19)
   at bootstrapNodeJSCore (internal/bootstrap/node.js:572:3)
nodejs_assert_module.htm
广告