我应该怎么做异步单元测试?

aka*_*aka 5 javascript unit-testing node.js pg-promise

我正在使用pg-promise.我是学习者,请原谅,如果这对你来说似乎微不足道.我怎样才能进行单元测试.错误输出数据未定义.我一直在js文件中建立连接并导出该module.another js文件用于查询数据库和获取结果集.代码正在按预期工作,我怎么能用mocha和chai编写单元测试.

test1.js
var dbConn= pgp(connUrl);
module.exports = {
    getconnect: function () {
        return dbConn;
    }
};
Run Code Online (Sandbox Code Playgroud)

test2.js

module.exports = {
    getData: function (req, res) {
      db.getconnect().query(sqlStr, true)
                .then(function (data) {  
                    console.log("DATA:", data);
                    return data; 
                  } } }
Run Code Online (Sandbox Code Playgroud)

unittest.js

describe("Test Cases", function (done) {

    it('retrieve response', function (done) {
        var req = {};
        var res = {};
        test2.getData(req, res);    
        // how would i retrieve value of data from test2.js so i can test
        done();
    });
});
Run Code Online (Sandbox Code Playgroud)

我如何从unittest.js中的test2.js中检索"数据"值

vp_*_*rth 5

getData必须回报承诺.客户端代码将能够识别它完成(解决)的那一刻.

module.exports = {
    getData: function (req, res) {
      return db.getconnect().query(sqlStr, true)
                .then(function (data) {  
                    console.log("DATA:", data);
                    return data; 
                  } } }
Run Code Online (Sandbox Code Playgroud)

测试:

describe("Test Cases", function () {
    it('retrieve response', function (done) {
        var req = {};
        var res = {};
        test2.getData(req, res).then(function(data){
          // test of data returned
          done(); // finish test
        }).catch(done);// report about error happened
    });
});
Run Code Online (Sandbox Code Playgroud)

如果您不需要模块中的任何数据处理,则可以删除整个.then部分而不进行任何功能更改.
但是如果你想预处理数据 - 不要忘记从每个链接返回它.then.

如果您的测试库需要存根异步内容,您可以使用async/await功能来处理它.

it('retrieve response', async function(){
  try {
    var data = await test2.getData(req, res);
    // test data here
  } catch (e) {
    // trigger test failed here
  }
});
Run Code Online (Sandbox Code Playgroud)

或者存根,就像这样:

var dbStub = sinon.stub(db, 'getConnect');
dbStub.yields(null, {query: function(){/*...*/}});
Run Code Online (Sandbox Code Playgroud)