使用sinon.stub时能否在单个测试用例中替换同一资源的多个方法
关于sinon.stub同一资源多方法打桩的问题解答
核心结论
完全可以在同一个测试用例中为同一资源的多个不同方法分别打桩,这是sinon非常常见的合法使用场景。
你的示例代码注意事项
你给出的代码存在一个潜在的坑:如果DBInstance.getCollection()每次调用都会返回全新的对象实例,那么你两次stub的实际是两个不同对象的方法,后续实际业务代码调用时拿到的又是新的实例,就会出现打桩不生效的问题。
正确的写法应该是先把collection实例缓存下来,再对同一个实例的多个方法打桩,示例如下:
it('should render', () => { // 先缓存同一个collection实例 const collection = DBInstance.getCollection() // 对同一个实例的不同方法分别打桩 sinon.stub(collection, 'find').returns({}) sinon.stub(collection, 'findOne').returns({}) // 此处执行测试业务逻辑... // 测试结束后还原stub,避免影响其他用例 collection.find.restore() collection.findOne.restore() })
实用提示
- 如果你要打桩的方法数量很多,可以用
sinon.stub(obj).methods(['find', 'findOne']).returns({})的批量写法,语法更简洁 - 每个stub都是独立的,可以分别给不同方法配置不同的返回值、自定义调用逻辑,或者单独断言方法的调用次数、入参是否符合预期
- 也可以用
sinon.createSandbox()统一管理所有stub,测试结束后直接调用sandbox.restore()即可批量还原所有打桩,避免遗漏单个方法的还原操作
内容的提问来源于stack exchange,提问作者A_J
相关产品推荐
相关产品推荐

