Search code examples
node.jsunit-testingmocha.jschainode-mysql

How to unit test a pool connection?


I would like to unit test (mocha & chai) a pool connection (mysql) in my node.js app. I don't know if I'm using the tests in the correct way and, if so, why they are always qualified as "pending".

Giving the following code, how would I test it?

var pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'userName',
    password: 'userPass',
    database: 'userDatabase',
    debug: false
});

I have tried in many ways but it doesn't seem to work. Best I got was this:

describe("Database", function () {
    describe("Connection", function () {
        it("Should connect without an error", pool.getConnection(function (err, connection) {
            expect(err).to.be.null;
            })
        );
    })
});

Which would return, if credentials are correct:

Express server listening on port 8080
  Database
    Connection
      - Should connect without an error


  0 passing (15ms)
  1 pending

And return, if credentials are incorrect:

Express server listening on port 8080
  Database
    Connection
      - Should connect without an error
      1) Uncaught error outside test suite


  0 passing (23ms)
  1 pending
  1 failing

  1) Database Connection Uncaught error outside test suite:
     Uncaught AssertionError: expected [Error: ER_DBACCESS_DENIED_ERROR: Access denied for user 'userName'@'localhost' to database 'userDatabase'] to be null

Thank you in advance.


Solution

  • What you pass to it in the 2nd argument must be a function. Right now you are doing:

    it("Should connect without an error", pool.getConnection(...))
    

    pool.getConnection takes a callback so in all likelihood, it returns undefined. So it looks like this to Mocha:

    it("Should connect without an error", undefined)
    

    And this is a pending test because having undefined for the callback is the way to tell Mocha the test is pending. You need to wrap your call to pool.getConnection in a function:

    it("Should connect without an error", function (done) {
        pool.getConnection(function (err, connection) {
            if (err) {
                done(err); // Mocha will report the error passed here.
                return;
            }
            // Any possible tests on `connection` go here...
    
            done();
        });
    });