我正在尝试测试一个使用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是一个假函数,但它确实被正确存根):
var stub = sinon.stub(db, 'saveUser').callsFake(() => { return 'Saved from stub' });
然而,这在pg模块上不起作用,我尝试对构造函数,Pool,.connect,.release甚至整个模块进行存根,但由于某种原因似乎没有任何工作。
PS:我还尝试将所有变量的const改为var,因为我认为这是原因,结果也是一样的。我还尝试了在存根中的promise,以几种方式,没有改变。
创建一个返回 pg 客户端的新函数,并在查询
函数中使用它:
//db.js
exports.getPgClient = () => {
return pool.connect();
};
exports.query = async (query) => {
const client = await exports.getPgClient();
...
};
在您的测试中,为getPgClient
函数创建一个存根,并返回一个带有存根的connect
和释放
方法的假客户端:
// 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));
});
注意:我在stubedgetPgClient
函数中返回一个已实现的promise,因为原始函数也返回一个promise。