我想在我的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
提前谢谢。
答案 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`
});
});
另请注意,这些不是“单元测试”,而是集成测试,因为它们测试两个系统一起工作,而不仅仅是您的应用程序本身按预期运行。