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])
功能: 创建一个存根,替换函数并允许预定义其行为:返回