Sinon JavaScript 测试库 (Node.js): 完整指南与实战示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Sinon for JavaScript (Node.js): 完整指南与实战示例

1. 什么是 Sinon?为什么需要它?

Sinon.js 是一个功能强大的 JavaScript 测试库,提供独立的测试替身:间谍(spies)、桩(stubs)和模拟对象(mocks)。它不依赖任何特定测试框架(Mocha、Jest、Jasmine 等),可与它们无缝集成。Sinon 的核心目标是隔离被测代码与外部依赖(数据库、API、文件系统、定时器),让你在可控环境中验证函数行为。

为什么需要它?在实际应用中,函数经常调用其他函数、访问外部服务或处理异步操作。没有 Sinon,你很难轻松验证回调函数是否被调用、调用时传入了哪些参数、调用了多少次,或者模拟服务器返回的数据。Sinon 优雅而简洁地解决了这些问题,让测试变得快速、可靠且可预测。

该库在 Node.js 生态系统中尤其受欢迎,因为单元测试至关重要。它允许你测试函数,而无需发起真实 HTTP 请求、访问数据库或等待定时器。这能将测试执行速度提升数十倍,并使其成为确定性测试。

2. 安装

Sinon 通过 npm 安装。对于 Node.js,执行以下命令:

npm install sinon --save-dev

如果你使用 TypeScript,还需安装类型定义:

npm install sinon @types/sinon --save-dev

若在浏览器中使用,可引入 CDN 版本:

<script src="https://cdn.jsdelivr.net/npm/sinon@latest/pkg/sinon.js"></script>

安装后,在测试文件中导入库:

const sinon = require('sinon'); // CommonJS
// 或
import sinon from 'sinon'; // ES Modules

3. 快速上手——最小工作示例

来看一个最简单的例子:一个调用回调函数并传入问候语的函数。我们要验证回调函数是否被正确参数调用。

const sinon = require('sinon');

// 被测函数
function greet(name, callback) {
  callback(`Hello, ${name}!`);
}

// 使用间谍(spy)进行测试
const callbackSpy = sinon.spy();
greet('Alice', callbackSpy);

console.log(callbackSpy.calledOnce);    // true
console.log(callbackSpy.calledWith('Hello, Alice!')); // true

这个例子展示了基本思路:我们创建一个间谍,将其传入被测函数,然后验证它的调用情况。在实际测试中,你会使用测试框架的断言(assertions)。

4. 核心方法/函数/类

4.1. sinon.spy() —— 间谍

签名: sinon.spy([object], [method]) 或 sinon.spy([func])

功能: 创建一个间谍,记录函数调用的信息:调用次数、参数、上下文、返回值。可以包装现有函数或替换对象的方法。

示例:

const user = {
  setName: function(name) { this.name = name; }
};

const spy = sinon.spy(user, 'setName');
user.setName('John');

console.log(spy.calledOnce);      // true
console.log(spy.calledWith('John')); // true
console.log(spy.firstCall.args);  // ['John']

spy.restore(); // 务必恢复原始方法

4.2. sinon.stub() —— 桩(存根)

签名: sinon.stub([object], [method])

功能: 创建一个存根,替换函数并允许预定义其行为:返回

推荐