• Node.js Video Tutorials

Node.js - 新的 assert.CallTracker()



本章将讨论 Node.js 中的 assert.CallTracker() 类。在深入探讨该类之前,让我们先了解一下 Node.js 中的断言。

Node.js 中的断言

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

断言是编程语言中至关重要的组成部分,因为它们允许我们评估一段代码是否正确或准确。通过此,我们可以构建高质量的代码。

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

如何导入和使用 Assertion 模块

要导入 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();

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

如果我们编译并运行代码,则不会抛出任何错误,因为 funccall 按照预期调用了指定的次数。

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

什么是跟踪器报告?

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

信息对象包含如下描述:

  • message<字符串> 消息将由函数自动分配。

  • actual<数字> 这显示了函数被调用的实际次数。

  • expected<数字> 这显示了函数预期调用的次数。

  • operator<运算符> 这将让我们知道包装函数所包装的函数的名称。

  • stack<对象> 函数的堆栈跟踪。

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

示例

在下面的示例中,

  • 在这段代码中,我们期望 funccall 被调用 3 次。但是 funccall 只被调用了一次,因此将抛出错误。

  • 当我们调用 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
   }
]
nodejs_assert_module.htm
广告
© . All rights reserved.