Node.js 节点/Sinon-库或模块中的存根函数(节点postgres)

Node.js 节点/Sinon-库或模块中的存根函数(节点postgres),node.js,unit-testing,sinon,Node.js,Unit Testing,Sinon,我正在尝试测试一个使用pg模块查询数据库的函数,下面是我如何使用它: const { Pool } = require('pg'); const { liveDB } = require('../config/db'); const pool = new Pool(liveDB); exports.query = async (query) => { const client = await pool.connect(); try { var resul

我正在尝试测试一个使用pg模块查询数据库的函数,下面是我如何使用它:

const { Pool } = require('pg');
const { liveDB } = require('../config/db');
const pool = new Pool(liveDB);

exports.query = async (query) => {
    const client = await pool.connect();

    try {
        var result = await client.query(query);
        console.log('result from db.query', result);
        return result;
    } catch (err) {
        console.log('ERROR in db.query')
        console.error(err);
        throw err;
    } finally {
        console.log('Releasing client');
        await client.release();
    }
};
通常,我会这样存根一个函数(db.saveUser在这里是一个伪函数,但它的存根正确):

但是,这在pg模块上不起作用,我尝试了stub构造函数、Pool、.connect、.release甚至整个模块,但由于某种原因,似乎什么都不起作用


PS:我也尝试将所有变量的const改为var,因为我认为这是原因,结果是一样的。我还在存根中尝试了几种方法,没有改变。

创建一个新函数,返回一个pg客户机,并在
query
函数中使用它:

//db.js

exports.getPgClient = () => {
  return pool.connect();
};

exports.query = async (query) => {
  const client = await exports.getPgClient();
  ...
};
在测试中,为
getPgClient
函数创建存根,并使用存根
connect
release
方法返回假客户端:

//test.js

let fakeClient = {
  connect() => { do something or stub this method },
  release() => { do something or stub this method }
};

before() => {
  sinon.stub(db, 'getPgClient').callsFake(() => Promise.resolve(fakeClient));
});

注意:我在stubbed
getPgClient
函数中返回已实现的承诺,因为原始函数也返回承诺。

sinon.stub()
返回承诺@alexmac©turmuka,否。当调用刺伤函数时,将返回承诺。库中的内容不能像普通模块一样替换有什么原因吗?对于一个小项目来说,这很好,但我不希望有所有额外的代码/公开一些确实不应该导出的函数。如回答中所述,创建一个新的导出函数,返回由
pg
对象创建的函数,并在测试中为此对象创建一个模拟。2.例如,使用特殊模块访问外部(专用)模块对象。3.为
pg
模块创建一个模拟对象。在这种情况下,您需要考虑如何需要此模块。可能添加
if
语句,验证
process.env、NODE_env
和required needed模块,或者可能创建一个将返回所需模块的服务。
let fakeClient = {
  connect() => { do something or stub this method },
  release() => { do something or stub this method }
};

before() => {
  sinon.stub(db, 'getPgClient').callsFake(() => Promise.resolve(fakeClient));
});