Node.js 中的 Stubs

2025年2月27日 | 阅读 4 分钟

在 Node.js 测试中使用 Mocha、Chai 和 Sinon 等测试框架时,Stubs(存根)在 Node.js 测试中至关重要。它们充当一种测试替身,允许程序员隔离和修改函数或方法的行为,以测试代码的特定部分。这种隔离有助于创建更可靠和可预测的测试。Stub(存根)是程序中的一个快速例程,它取代了一个可以稍后加载或远程查找的更长的程序。

Stub 是一种用于测试的对象或函数,它模仿真实的函数或方法。与用于验证特定交互是否发生的 mocks(模拟)不同,stubs(存根)用于控制函数的行为。它们可以

  • 修改函数的实现方式,使其变为其他方式。
  • 强制从函数返回特定值。
  • 处理模型中的错误或其他异常情况。

Stubs(存根)的特点

Stubs(存根)的几个特点如下:

  • 有两个可能的匿名存根。
  • Stubs(存根)可用于包装现有函数。围绕现有函数包装的 Stub(存根)不会调用原始函数。
  • Stub(存根)函数或程序会影响其他模块或组件的行为。
  • Stubs(存根)是与测试相关的虚拟对象。
  • Stubs(存根)实现预先编程的响应。

Stubs(存根)的用法

Stubs(存根)的几个用途如下:

  • 隔离:Stubs(存根)可用于将正在测试的代码与其依赖项隔离开。当这些依赖项(如数据库查询或网络调用)复杂、缓慢或不可预测时,这很有用。
  • 控制:由于 Stubs(存根)的存在,我们可以精确地控制函数的行为。可以模拟各种场景,包括边缘情况和错误条件,这些场景很难以其他方式重现。
  • 速度:Stub(存根)测试通常更快,因为它们不依赖于真实的外部依赖项。
  • 可靠性:Stub(存根)通过消除真实依赖项的不可预测性,有助于使测试更具可重复性和可靠性。

示例 1

让我们用一个例子来说明 Node.js 中的 Stubs。

输出

 
Subscriber 1 called
Subscriber 2 called
Subscriber 3 called   

说明

此示例还验证了即使一个订阅者遇到问题,通知也会发送给所有事件订阅者。测试确保

  • failingSubscriber 抛出的异常已得到适当处理。
  • FirstSubscriber 和 secondSubscriber 都被调用。
  • 在 first subscriber 之前调用 leakingPrior subscriber。
  • 测试的描述是“确保所有订阅者都被正确通知,没有任何错误”。
  • Event、subscriber1、subscriber2 和 subscriber3 是重命名的变量。
  • 控制台日志记录:每次有调用进入时,每个订阅者都会打印一条消息。

示例 2

让我们再用一个例子来说明 Node.js 中的 Stubs。

输出

 
First subscriber notified
Second subscriber notified
Third subscriber notified   

说明

  • 在此示例中,测试描述是“记录所有订阅者调用并进行无错误调用”。
  • 修改后的变量:testClock、firstSubscriber、secondSubscriber、thirdSubscriber 和 topic。
  • 控制台日志记录:听到订阅者的消息后,每个订阅者都会打印一条消息。

结论

借助 Node.js stubs,我们可以创建受控且可靠的单元测试,这得益于 Sinon 等库。通过分离和修改特定函数Thus,stubby 函数使开发人员能够模拟各种场景,包括错误条件和边缘情况,而无需依赖真实的实现。这在发布-订阅模式中尤为有用,在这种模式下,确保所有订阅者都得到适当通知非常重要,正如示例所示。Stub(存根)通过确保每次交互都经过彻底测试以及测试能够快速可靠地进行,有助于维护测试环境的完整性。通过整合控制台输出和验证调用顺序,我们可以确保强大的代码质量并更深入地理解执行流程。


下一个主题Node.js 线程池