Search code examples
mysqlnode.jsunit-testingsinonsinon-chai

How to mock promisified Mysql data using sinon for Unit Testing


Is it possible to mock promisified queries in NodeJS using sinon for require('promise-mysql') npm package. As Sinon allows us to mock and / or stub out methods on objects. Say I want to override the createConnection() method so that it returns a valid object regardless of whether the database settings were right or not, I'd stub out that method. I am able to mock that using require('mysql') npm package which is having callbacks.

But, as require('promise-mysql') package returns promise, I am not sure about how to mock test data for same.

For require('mysql') package this is working perfectly

var successConnectionObject = {
        connect: function(cb) {
            cb();
        },
        query: function(sqlQury, cb) {
            if (sqlQury === 'SELECT * FROM USERS') {
                cb(null, constants.USERQueryResp);
            } else {
                cb(null, '');
            }
        },
        end: function() {} 
}

var testMysqlDriver = require('mysql');
var stub = sinon.stub(testMysqlDriver, 'createConnection');
stub.returns(successConnectionObject);

 publish.handler(some_JSON_Request, some_Context_Values, function(err, data) {
    expect(data.message).toBe(USER_Query_Response);
    done();
}); 

how can we achieve same this using require('promise-mysql');


Solution

  • You can use Promise.resolve and Promise.reject as return values

    var successConnectionObject = {
            connect: function() {
                return Promise.resolve()
            },
            query: function(sqlQury) {
                if (sqlQury === 'SELECT * FROM USERS') {
                    return Promise.resolve(constants.USERQueryResp);
                } else {
                    return Promise.resolve(';')
                }
            },
            end: {function() {} 
    }
    

    If your nodejs version don't have Promise, you can use bluebird, or any other Promise library

    var Promise=require('bluebird')