使用 Sinon.js 可以轻松验证函数被调用时的参数,通过其提供的断言方法和调用信息对象,可以精确检查函数调用时传递的参数是否符合预期。以下是具体的实现方法和示例:

核心方法与属性

Sinon 提供了多种方式验证函数调用参数,常用的包括:

方法/属性

说明

spy.calledWith(arg1, arg2...)

函数是否至少一次被传入这些参数调用

spy.calledWithExactly(arg1, arg2...)

函数是否至少一次被传入完全匹配的参数调用

spy.firstCall.args

第一次调用时的参数数组

spy.secondCall.args

第二次调用时的参数数组

spy.lastCall.args

最后一次调用时的参数数组

sinon.assert.calledWith(spy, arg1...)

断言函数被传入指定参数调用

示例:验证函数调用参数

假设我们有一个处理用户数据的自定义 Hook useUserActions,它内部会调用 api.updateUser 函数,我们需要验证该函数被调用时的参数是否正确:

关键技巧说明

  1. 宽松匹配 vs 严格匹配
  • calledWith():宽松匹配,只要参数包含指定值即可(类似 includes
  • calledWithExactly():严格匹配,参数必须与指定值完全一致(类似 ===
  1. 访问特定调用的参数
  • 通过 firstCallsecondCalllastCall 访问对应调用的信息
  • 这些对象的 args 属性是一个数组,包含该次调用的所有参数
  1. 模糊匹配参数 使用 sinon.match() 进行部分匹配或类型匹配:
// 验证参数包含某个属性
expect(spy.calledWith(sinon.match({ id: 123 }))).to.be.true;// 验证参数类型
expect(spy.calledWith(sinon.match.number, sinon.match.string)).to.be.true;
  1. 异步函数的参数验证 对于异步函数,需要等待 Promise 完成后再验证参数(如示例中的 await new Promise(...)

总结

使用 Sinon.js 验证函数调用参数的核心流程是:

  1. sinon.stub()sinon.spy() 监视目标函数;
  2. 执行触发函数调用的操作(同步或异步);
  3. 使用 calledWith()calledWithExactly() 等方法或 firstCall.args 等属性验证参数。

这种方式可以精确确保函数被传入正确的参数,是测试自定义 Hooks 与外部依赖交互的重要手段。