如何在 Sinon 中模拟链式函数调用

Posted

技术标签:

【中文标题】如何在 Sinon 中模拟链式函数调用【英文标题】:How to mock a chained function call in Sinon 【发布时间】:2021-12-17 09:38:18 【问题描述】:

你如何使用这样的诗乃模拟?

const data = await getData(); 
const res= await data.collection('myCollection').deleteOne( id: 12 );

【问题讨论】:

怎么样:jsfiddle.net/76484/59up8qdr? 谢谢。但是如何检查是否调用了方法 updatedone? 你如何检查是否实际调用了 deleteone? 有间谍!见:jsfiddle.net/76484/1dgnyju8 这能回答你的问题吗? ***.com/questions/37948135/… 【参考方案1】:

您可能正在寻找.returnsThis(),它只返回函数的this,就像这样的流式API 所做的那样,并且专门用于存根此类API。

你可以这样使用它:

const db = require('...')

async function test() 
  // Setup
  const fakeResponse = 
    collection: Sinon.stub().returnsThis(),
    deleteOne: Sinon.stub().returnsThis()
  
  Sinon.stub(db, 'getData').resolves(fakeResponse)
  
  // Call your code that does stuff
  const data = await db.getData(); 
  const res = await data.collection('myCollection').deleteOne( id: 12 )
  
  // Assert
  Sinon.assert.calledWith(fakeResponse.collection, 'myCollection')
  Sinon.assert.calledWith(fakeResponse.deleteOne,  id: 12 )

我在这里假设getData 是某个对象的方法,比如db。如果没有,您将不得不想出其他方法来存根 getData()

【讨论】:

以上是关于如何在 Sinon 中模拟链式函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jest 模拟链式函数调用?

如何使用 sinon 和 Mocha 模拟对 mysql 查询 nodeJS 的 Promisify 调用?

跟踪使用 Sinon/Mocha 调用方法的次数

用于链式函数调用的 Jest 单元测试

原生JS模拟Promise实现详解

使用 Sinon NodeJs 编写测试用例