2016-05-21 45 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