如何对池连接进行单元测试?

时间:2017-02-24 13:30:49

标签: node.js unit-testing mocha chai node-mysql

我想在我的node.js app中对池连接(mysql)进行单元测试(mocha& chai)。我不知道我是否以正确的方式使用测试,如果是的话,为什么他们总是有资格作为"等待"。

给出以下代码,我该如何测试?

UPDATE my_table 
   SET active = 'Y' 
 WHERE active = 'N'
 ORDER 
    BY id 
 LIMIT 1;

我在很多方面尝试过,但它似乎没有用。我得到的最好的是:

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

如果凭据正确,哪些会返回:

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

如果凭据不正确,请返回:

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


  0 passing (15ms)
  1 pending

提前谢谢。

2 个答案:

答案 0 :(得分:2)

在第二个参数中传递给it的内容必须是函数。现在你正在做:

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

pool.getConnection接受回调,因此很有可能返回undefined。所以Mocha看起来像这样:

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

这是一个待定的测试,因为回调的undefined是告诉Mocha测试正在等待的方法。您需要在函数中包含对pool.getConnection的调用:

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

答案 1 :(得分:1)

请参阅mocha文档中的testing asynchronous code。您的it功能应类似于以下内容。

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

或者,如果要在回调中添加断言,请执行以下操作:

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

请注意,最好使用promises进行测试,因为这样可以在连接对象上运行expect语句而无需额外的try / catch / done语句。例如,如果pool.getConnection返回承诺,您可以执行以下操作:

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

另请注意,这些不是“单元测试”,而是集成测试,因为它们测试两个系统一起工作,而不仅仅是您的应用程序本身按预期运行。