aka aka - 6 months ago 29
Node.js Question

how should i do asynchronous unit testing?

I am using pg-promise. i am learnner please excuse if it seems trivial to you. how can i wrtie unit test for. it errors out data is undefined. i have been making connection in js file and export that module.another js file use to query against database and fetch result set. code is working as expected having issue how can i write unit test with mocha and chai.

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


how would i retrieve "data" value from test2.js inthe unittest.js

Answer

Your getData must return the promise. Client code will be able to recognize the moment it's finished(resolved).

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

test:

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

If you don't need to any process of data in your module, you can to remove whole .then section without any functionality changes.
But if you want to preprocess data - don't forget to return it from each chained .then.

If your test library requires stubs for async stuff, you can use async/await feature to deal with it.

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

Or stub it, something like this:

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