Node.js - assert.throws() 函数



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

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

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

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

语法

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


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

参数

此函数接受三个参数。下面将对此进行描述。

  • fn − (必需)此参数包含函数 fn,并期望该函数抛出错误。
  • error − (可选) 此参数可以是 RegExp、验证函数、对象或 Error(错误实例)。
  • message − (可选)字符串或错误类型可以作为输入传递到此参数中。

返回值

如果函数 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

注意 : 函数错误的第二个参数不能是字符串。如果字符串作为错误传递,则假定省略该错误,并将该字符串用于函数的消息参数。如果使用的消息与抛出的错误消息相同,则会生成 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)