• 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
廣告