使用Sinon Stub pg.Pool.prototype.query无效,仍返回真实数据库数据
问题分析与解决方案
你的测试代码存在几个关键问题导致Stub不生效,以下是具体问题和修正方案:
问题点
- 拼写错误:
beforeEarch应该是beforeEach,导致Stub逻辑根本没有执行 - Stub目标错误:你Stub了
pg.Pool.prototype.query,但实际getData中调用的是db.connect()返回的**客户端连接对象(client)**的query方法,而非Pool自身的query方法 - 异步处理错误:
query是异步方法,用returns返回同步值无法被await正确处理;同时返回结构不符合pg的响应格式,getData中取的是response.rows,你直接返回了数组,无法匹配
修正后的测试代码
const sinon = require('sinon'); const backendFile = require('./backendFile'); const db = require('./dbConfig.js'); // 直接引入已实例化的Pool对象 describe("Test", function () { let sampleData = [{ a: '1', b: '2', c: '3', }]; let connectStub; let queryStub; let releaseStub; beforeEach(() => { // 模拟客户端连接对象 const mockClient = { query: sinon.stub().resolves({ rows: sampleData }), // 模拟query返回符合格式的异步结果 release: sinon.stub() // 模拟release方法 }; // Stub Pool的connect方法,返回模拟的client connectStub = sinon.stub(db, 'connect').resolves(mockClient); queryStub = mockClient.query; releaseStub = mockClient.release; }); afterEach(() => { // 还原所有Stub,避免污染其他测试 connectStub.restore(); queryStub.restore(); releaseStub.restore(); }); it("test 1", async function () { let data = await backendFile.getData(); console.log(data); // 现在会输出sampleData: [{a:'1', b:'2', c:'3'}] // 还可以添加断言验证调用情况 sinon.assert.calledOnce(connectStub); sinon.assert.calledOnceWithExactly(queryStub, `SELECT * FROM data;`); sinon.assert.calledOnce(releaseStub); }); });
关键说明
- 直接引入已实例化的
db对象,Stub它的connect方法,返回我们自己模拟的客户端对象 - 模拟客户端的
query方法时,用resolves返回一个包含rows属性的对象,和pg真实响应结构一致 - 在
afterEach中还原所有Stub,确保每个测试都是独立的
内容的提问来源于stack exchange,提问作者lhoogenraad
相关产品推荐
相关产品推荐

