You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Sinon Stub pg.Pool.prototype.query无效,仍返回真实数据库数据

问题分析与解决方案

你的测试代码存在几个关键问题导致Stub不生效,以下是具体问题和修正方案:

问题点

  1. 拼写错误:beforeEarch应该是beforeEach,导致Stub逻辑根本没有执行
  2. Stub目标错误:你Stub了pg.Pool.prototype.query,但实际getData中调用的是db.connect()返回的**客户端连接对象(client)**的query方法,而非Pool自身的query方法
  3. 异步处理错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:15:59