Node / Sinon - 库或模块中的存根函数(node-postgres)

时间:2017-09-08 20:37:17

标签: 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 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,因为我认为这是原因,结果相同。我也在存根中尝试过承诺,在几个方面,没有变化。

1 个答案:

答案 0 :(得分:1)

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

// db.js

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

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

在测试中,为getPgClient函数创建一个存根,并返回一个带有存根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。