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

Node.js 如何对池连接进行单元测试?,node.js,unit-testing,mocha.js,chai,node-mysql,Node.js,Unit Testing,Mocha.js,Chai,Node Mysql,我想在node.js应用程序中对池连接(mysql)进行单元测试(mocha&chai)。我不知道我是否以正确的方式使用这些测试,如果是,为什么它们总是被限定为“待定” 给出下面的代码,我将如何测试它 var pool = mysql.createPool({ connectionLimit: 100, host: 'localhost', user: 'userName', password: 'userPass', database: 'userDat

我想在node.js应用程序中对池连接(mysql)进行单元测试(mocha&chai)。我不知道我是否以正确的方式使用这些测试,如果是,为什么它们总是被限定为“待定”

给出下面的代码,我将如何测试它

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
如果凭据不正确,则返回:

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
提前谢谢。

请参见摩卡文档中的。您的
it
功能应该与下面的类似

it('应无错误地连接',函数(完成){
pool.getConnection(完成);
});
或者,如果要在回调中添加断言,请执行以下操作:

it('应无错误地连接',函数(完成){
pool.getConnection((错误,连接)=>{
试一试{
expect(connection).to.not.be.null;
expect(connection).to.have.property('foo');
完成();
}捕获(错误){
完成(错误);
}
});
});
注意:最好使用承诺进行测试,因为这样可以在连接对象上运行
expect
语句,而无需额外的try/catch/done语句。例如,如果
pool.getConnection
返回承诺,则可以执行以下操作:

it('应无错误地连接',函数(){
返回池.getConnection(连接=>{
expect(connection).to.have.property('foo');
//关于`连接'的更多断言`
});
});
还要注意的是,这些不是“单元测试”,而是集成测试,因为它们测试的是两个系统是否协同工作,而不仅仅是您的应用程序是否按预期运行。

请参见mocha文档中的。您的
it
功能应该与下面的类似

it('应无错误地连接',函数(完成){
pool.getConnection(完成);
});
或者,如果要在回调中添加断言,请执行以下操作:

it('应无错误地连接',函数(完成){
pool.getConnection((错误,连接)=>{
试一试{
expect(connection).to.not.be.null;
expect(connection).to.have.property('foo');
完成();
}捕获(错误){
完成(错误);
}
});
});
注意:最好使用承诺进行测试,因为这样可以在连接对象上运行
expect
语句,而无需额外的try/catch/done语句。例如,如果
pool.getConnection
返回承诺,则可以执行以下操作:

it('应无错误地连接',函数(){
返回池.getConnection(连接=>{
expect(connection).to.have.property('foo');
//关于`连接'的更多断言`
});
});

还要注意的是,这些不是“单元测试”,而是集成测试,因为它们测试的是两个系统是否协同工作,而不仅仅是您的应用程序本身的行为是否符合预期。

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

it("Should connect without an error", pool.getConnection(...))
pool.getConnection
接受回调,因此它很可能返回
undefined
。对摩卡来说是这样的:

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

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

it("Should connect without an error", pool.getConnection(...))
pool.getConnection
接受回调,因此它很可能返回
undefined
。对摩卡来说是这样的:

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

请注意,这是一个集成测试,而不是单元测试。它测试两个系统一起工作,而不是应用程序中的单个功能单元单独工作。有关测试数据库调用的信息,请参阅。请注意,这是一个集成测试,而不是单元测试。它测试两个系统一起工作,而不是应用程序中的单个功能单元单独工作。有关测试数据库调用的信息,请参阅。如果
expect(err).to.be.null
引发异常,则不会调用
done()
,因此测试在超时之前不会解决问题?这是事实,但通常不是问题。99.9999%的时间测试将通过,并且不会达到超时。尽管如此,我还是对我的答案进行了编辑,以显示它如何能够立即通过。如果OP不打算在回调中进行任何其他测试,那么OP可以将其减少到您的答案中的测试,但是如果要对
connection
进行任何测试,那么应该首先检查
err
。假设我使用
pool.getConnection()
在对象构造函数中,并将查询结果中的值分配给我的对象属性,
done()
调用是否会在调用
var user=new user(1)时等待我的对象完全创建完毕例如?调用
done()
会在调用发生时有效地将测试标记为已完成。您必须延迟呼叫
done
。如果让构造函数异步工作,那么在测试和生产中遇到的问题是相同的:测试需要知道构造函数何时完成了对象的构造,但生产代码也需要知道这一点。否则,它将过早地使用该对象。大多数“最佳实践”指南都会告诉您使构造函数同步工作,并通过实例上调用的方法执行任何异步操作。如果
expect(err).to.be.null
引发异常,则不会调用
done()
,因此直到超时测试才会解决?这是真的,但这通常不是一个问题。99.9999%的t