2017-09-08 136 views
2

我试图测试使用PG模块查询数据库的功能,在这里是如何我使用它:节点/兴农 - 库或模块(节点的Postgres)存根功能

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

创建一个新的函数返回一个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)); 
}); 

说明:由于原函数也返回一个Promise,所以我返回了一个满足承诺getPgClient函数。

+0

'sinon.stub()'返回一个承诺? @alexmac – turmuka

+1

©turmuka,no。当被刺的函数被调用时,Promise将被返回 – alexmac

+0

有没有理由为什么库中的东西不能像普通模块一样被替换?对于一个小项目来说很好,但我宁愿没有额外的代码/暴露一些真的不应该导出的函数。 – Mankind1023