Node.js - new assert.CallTracker()



在本章中,我们将讨论什么是 assert.CallTracker() 类Node.js。在进入上述课程之前,让我们先了解一下什么是Node.js中的 Assertion 。

Node.js中的 assert

可以使用 assert 来计算编程表达式。Node.js提供了一个名为 assertion 的模块,该模块包含不同类型的 assert 函数。assert 模块用于在 Node.js 中执行单元测试。

assertion 是编程语言中至关重要的组成部分,因为它们使我们能够评估一段代码是否正确或准确。通过这种方式,我们可以构建高质量的代码。

注意 : 要理解和了解 assert 函数的工作原理,您需要在计算机上安装最新的 Node 版本。

如何导入和使用 assert 模块

要导入 assert 模块,我们需要包含以下代码片段中的代码段。


 const assert = require('assert');

什么是 assert.CallTracker() ?

Node.js assert.CallTracker() 用于跟踪函数是否被调用了特定次数,这将通过使用其一些特殊函数来完成。

要创建 CallTracker 对象,我们需要添加代码,该代码位于下面的代码片段中。


const assert = require('assert');
const tracker = new assert.CallTracker();

现在,让我们在下面的示例中再添加几行代码,以了解 CallTracker 函数的工作原理。

在以下示例中,

  • 我们正在创建一个函数 func,它将打印一个数字的乘法表,直到一个特定的数字。
  • 然后我们创建一个函数 funccall,该函数将函数 func 作为Node.js tracker.calls() 函数的第一个参数。
  • 我们没有在第二个参数中传递整数值,因此默认情况下 tracker.calls() 假设值为 1,并期望函数调用一次。
  • 跟踪函数 func 被调用次数的唯一方法是将其包装 tracker.calls(),这将保存 func 被调用的次数记录。
  • 然后我们调用 tracker.verify() 来验证 funccall 是否按预期被调用了一次。


const assert = require('assert');
	 	
const tracker = new assert.CallTracker();
	 	
function func() {
	 	const number = 5;

//creating a multiplication table
	 	for(let i = 1; i <= 5; i++) {
	 	
	 	 	 // multiply i with number
	 	 	 const result = i * number;
	 	 		
	 	 	 // display the result
	 	 	 console.log(`${number} * ${i} = ${result}`);
	 	}
};

const funccall = tracker.calls(func);

funccall();

tracker.verify();

输出

const assert = require('assert');

const tracker = new assert.CallTracker();

function func() {
const number = 5;

//creating a multiplication table
for(let i = 1; i <= 5; i++) {

// multiply i with number
const result = i * number;

// display the result
console.log(`${number} * ${i} = ${result}`);
}
};

const funccall = tracker.calls(func);

funccall();

tracker.verify();

注意: 有时在线编译器可能无法给我们预期的结果,因此我们在本地执行上述代码。

如果我们编译并运行代码,则不会抛出错误,因为funcall是按照预期的次数调用的。

5 * 1 = 5
5 * 2 = 10
5 * 3 = 15
5 * 4 = 20
5 * 5 = 25

什么是跟踪器报告?

跟踪器报告是一个对象数组,其中包含有关跟踪函数时发生的错误的详细信息。

信息对象持有如下所述 -

  • message<string> 消息将由函数自动分配。
  • actual<number> 这显示了调用函数的实际次数。
  • expected<number> 这显示函数预期调用的次数。
  • operator<operator> 这将让我们知道被包装器函数包装的函数的名称。
  • stack<Object>函数的堆栈跟踪。

现在,让我们看一下示例,在该示例中,我们使用 tracker.report() 来获取有关跟踪函数时发生的错误的详细信息。

在下面的示例中,

  • 在此代码中,我们预计 funccall 将被调用 3 次。但是 funcall 只被调用了一次,因此会抛出错误。
  • 正如我们调用 tracker.report() 时,它将显示函数被调用和预期调用的次数等详细信息。

const assert = require('assert');

const tracker = new assert.CallTracker();

function func() {
	 	const number = 5;
	 	
//creating a multiplication table
	 	for(let i = 1; i <= 2; i++) {
	 	
	 	 	 // multiply i with number
	 	 	 const result = i * number;
	 	 		
	 	 	 // display the result
	 	 	 console.log(`${number} * ${i} = ${result}`);
	 	}
};

const funccall = tracker.calls(func, 3);

funccall();

console.log(tracker.report());

输出

/home/cg/root/63a002c52763b/main.js:3
const tracker = new assert.CallTracker();
^

TypeError: assert.CallTracker is not a constructor
at Object.<anonymous> (/home/cg/root/63a002c52763b/main.js:3:17)
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)

注意 : 有时在线编译器可能无法给我们预期的结果,因此我们在本地执行上述代码。

在执行上述程序时,它将生成以下输出 :

5 * 1 = 5
5 * 2 = 10
[
{
message: 'Expected the func function to be executed 3 time(s) but was executed 1 time(s).',
actual: 1,
expected: 3,
operator: 'func',
stack: Error
at CallTracker.calls (node:internal/assert/calltracker:44:19)
at Object.<anonymous> (C:\Users\Lenovo\Desktop\JavaScript\nodefile.js:19:26)
at Module._compile (node:internal/modules/cjs/loader:1126:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1180:10)
at Module.load (node:internal/modules/cjs/loader:1004:32)
at Function.Module._load (node:internal/modules/cjs/loader:839:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
}
]