Faegy
Faegy

Reputation: 992

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.

Upvotes: 1

Views: 3526

Answers (2)

Liam Gray
Liam Gray

Reputation: 1129

See testing asynchronous code in the mocha docs. Your it function should look similar to the below.

it('Should connect without an error', function (done) {
  pool.getConnection(done);
});

Or, if you want to add assertions inside your callback do the following:

it('Should connect without an error', function (done) {
  pool.getConnection((err, connection) => {
    try {
      expect(connection).to.not.be.null;
      expect(connection).to.have.property('foo');
      done();
    } catch (error) {
      done(error);
    }
  });
});

Note you should preferably test with promises because this allows you to run expect statements on the connection object without extra try/catch/done statements. For example, if pool.getConnection returns a promise, you can do:

it('Should connect without an error', function () {
  return pool.getConnection(connection => {
    expect(connection).to.have.property('foo');
    // more assertions on `connection`
  });
});

Also note that these are not "unit tests", but integration tests, as they are testing that two systems work together rather than just your application behaving as expected on its own.

Upvotes: 1

Louis
Louis

Reputation: 151411

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

Upvotes: 4

Related Questions