如何同时Stub Sequelize中DBNAME的scope与findAll方法?
解决Sequelize链式调用
scope().findAll()的Sinon Stub问题 你当前的错误原因很明确:scope方法的Stub用了resolves(),这会让它返回一个Promise,而不是一个包含findAll方法的对象,所以调用scope(...).findAll()时自然会提示找不到该方法。
要正确Stub这种链式调用,需要让scope返回一个带有Stubbed findAll方法的模拟对象,具体代码如下:
it('mock db call', async() => { // 创建模拟查询对象,包含Stub后的findAll方法 const mockQueryInstance = { findAll: sinon.stub().resolves(dbDetails) }; // Stub scope方法,让它返回上述模拟对象(注意用returns而非resolves,因为scope是同步方法) sinon.stub(DBNAME, 'scope').returns(mockQueryInstance); const res = await func1(); sinon.assert.match(res, dbDetails); // 可选:验证调用是否符合预期 sinon.assert.calledWith(DBNAME.scope, 'includeEverything'); sinon.assert.calledOnce(mockQueryInstance.findAll); })
补充说明:
- Sequelize的
scope是同步方法,它返回的是一个带有查询能力的模型实例,所以Stub时必须用returns()返回模拟对象,而非异步的resolves()。 - 链式调用Stub的核心逻辑是:前一个方法的返回值必须包含下一个要调用的Stub方法,形成完整的调用链。
内容的提问来源于stack exchange,提问作者ktn987
相关产品推荐
相关产品推荐

