如何对池连接进行单元测试?
How to unit test a pool connection?
我想在我的 node.js 应用程序中对池连接 (mysql) 进行单元测试 (mocha & chai)。我不知道我是否以正确的方式使用测试,如果是这样,为什么它们总是符合 "pending".
给出以下代码,我将如何测试它?
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;
})
);
})
});
return,如果凭据正确:
Express server listening on port 8080
Database
Connection
- Should connect without an error
0 passing (15ms)
1 pending
和return,如果凭据不正确:
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
提前致谢。
请参阅 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
returns 一个承诺,你可以这样做:
it('Should connect without an error', function () {
return pool.getConnection(connection => {
expect(connection).to.have.property('foo');
// more assertions on `connection`
});
});
另请注意,这些不是 "unit tests",而是集成测试,因为它们测试的是两个系统是否协同工作,而不仅仅是您的应用程序单独按预期运行。
你在第二个参数中传递给 it
的必须是一个函数。现在你正在做:
it("Should connect without an error", pool.getConnection(...))
pool.getConnection
接受回调,所以很有可能 returns 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();
});
});
我想在我的 node.js 应用程序中对池连接 (mysql) 进行单元测试 (mocha & chai)。我不知道我是否以正确的方式使用测试,如果是这样,为什么它们总是符合 "pending".
给出以下代码,我将如何测试它?
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;
})
);
})
});
return,如果凭据正确:
Express server listening on port 8080
Database
Connection
- Should connect without an error
0 passing (15ms)
1 pending
和return,如果凭据不正确:
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
提前致谢。
请参阅 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
returns 一个承诺,你可以这样做:
it('Should connect without an error', function () {
return pool.getConnection(connection => {
expect(connection).to.have.property('foo');
// more assertions on `connection`
});
});
另请注意,这些不是 "unit tests",而是集成测试,因为它们测试的是两个系统是否协同工作,而不仅仅是您的应用程序单独按预期运行。
你在第二个参数中传递给 it
的必须是一个函数。现在你正在做:
it("Should connect without an error", pool.getConnection(...))
pool.getConnection
接受回调,所以很有可能 returns 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();
});
});