2016-05-21 51 views
4

我正在使用pg-promise。我是学习者,请原谅,如果它似乎微不足道。我该如何为单元测试。它错误的数据是不确定的。我一直在js文件中进行连接并导出该模块。另一个js文件用于查询数据库和读取结果集。代码正在按预期工作有问题我怎么能写摩卡和柴单元测试。我应该如何做异步单元测试?

test1.js 
var dbConn= pgp(connUrl); 
module.exports = { 
    getconnect: function() { 
     return dbConn; 
    } 
}; 

test2.js

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

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

我如何将检索 “数据” 值从test2.js在矿井unittest.js

+0

@维塔利吨。你能否建议我应该如何编写单元测试? – aka

+0

你应该问的正确的问题 - 如何编写异步库的测试。这与pg-promise无关。同时,你可以看看[pg-promise tests](https://github.com/vitaly-t/pg-promise/tree/master/test)作为例子,它们是图书馆自己测试的方式。 –

+0

奇怪的是,你有一个异步函数只记录一个输出,但别的什么都不做。如果输出到stdout是重要的,那么测试一下,不要测试该函数,因为该函数没有返回任何值使其无法测试。我个人将这个特定的测试写成bash脚本,因为这是最简单的方法。如果你必须用js编写它,然后按照你写bash脚本的方式写它:exec脚本并grep它的stdout。 – slebetman

回答

5

getData绝回报承诺。客户端代码将能够识别它完成(解决)的时刻。

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

测试:

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

如果您不需要数据的模块中的任何过程中,可以删除整个.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 
    } 
}); 

或存根它,像这样:

var dbStub = sinon.stub(db, 'getConnect'); 
dbStub.yields(null, {query: function(){/*...*/}}); 
+0

可以用sinon来完成吗?我怎么能实现它。非常感谢... – aka

+0

如果你的'node.js'版本支持'async/await',你可以使用它。添加回答。 –

0

如果你有一个函数返回的承诺,那么你可以在你的测试使用await

describe("Test Cases", function (done) { 
    it('retrieve response', async function (done) { 
     try { 
      var data = await test2.getData(); 
      // check data constraints ... 
      ... 
     } catch(err) { 
      ... 
     } 
     done(); // finish test 
    }); 
}); 
+0

它错过了像缺少的东西)。我检查了每个我不错过任何括号的地方 – aka