使用 Sinon.js 可以轻松验证函数被调用时的参数,通过其提供的断言方法和调用信息对象,可以精确检查函数调用时传递的参数是否符合预期。以下是具体的实现方法和示例:
核心方法与属性
Sinon 提供了多种方式验证函数调用参数,常用的包括:
方法/属性 | 说明 |
| 函数是否至少一次被传入这些参数调用 |
| 函数是否至少一次被传入完全匹配的参数调用 |
| 第一次调用时的参数数组 |
| 第二次调用时的参数数组 |
| 最后一次调用时的参数数组 |
| 断言函数被传入指定参数调用 |
示例:验证函数调用参数
假设我们有一个处理用户数据的自定义 Hook useUserActions
,它内部会调用 api.updateUser
函数,我们需要验证该函数被调用时的参数是否正确:
关键技巧说明
- 宽松匹配 vs 严格匹配
calledWith()
:宽松匹配,只要参数包含指定值即可(类似includes
)calledWithExactly()
:严格匹配,参数必须与指定值完全一致(类似===
)
- 访问特定调用的参数
- 通过
firstCall
、secondCall
、lastCall
访问对应调用的信息 - 这些对象的
args
属性是一个数组,包含该次调用的所有参数
- 模糊匹配参数
使用
sinon.match()
进行部分匹配或类型匹配:
// 验证参数包含某个属性
expect(spy.calledWith(sinon.match({ id: 123 }))).to.be.true;// 验证参数类型
expect(spy.calledWith(sinon.match.number, sinon.match.string)).to.be.true;
- 异步函数的参数验证
对于异步函数,需要等待 Promise 完成后再验证参数(如示例中的
await new Promise(...)
)
总结
使用 Sinon.js 验证函数调用参数的核心流程是:
- 用
sinon.stub()
或sinon.spy()
监视目标函数; - 执行触发函数调用的操作(同步或异步);
- 使用
calledWith()
、calledWithExactly()
等方法或firstCall.args
等属性验证参数。
这种方式可以精确确保函数被传入正确的参数,是测试自定义 Hooks 与外部依赖交互的重要手段。