节点/ Sinon – 库或模块中的存根function(node-postgres)

我试图testing一个函数,查询数据库使用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(); } }; 

通常情况下,我会存根这样的function(db.saveUser这里是一个假function,但它确实得到了正确的桩):

 var stub = sinon.stub(db, 'saveUser').callsFake(() => { return 'Saved from stub' }); 

然而,这不是在pg模块上工作,我试图存储构造函数,Pool,.connect,.release甚至整个模块,但似乎没有任何工作原因。

PS:我试着改变所有variables的const到var,因为我认为这是原因,相同的结果。 我也尝试了在存根中的承诺,在几个方面,没有改变。

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

// db.js

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

在您的testing中,为getPgClient函数创build一个存根,并返回带有存根connectrelease方法的假客户机:

// 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)); }); 

注意:我在getPgClient函数中返回满足的promise,因为原函数也返回一个Promise。