Nodejs mocha unit test sqlite3 回调未调用 insert 未执行



我想为我的应用创建单元测试。通过浏览器调用 API 时工作正常,但是当我想使用 npm test 或 mocha test 执行测试时,不会调用回调函数,也不会执行 INSERT 语句。我没有错误。法典:

单元测试文件:

process.env.NODE_ENV = 'test';
var chai = require('chai');
var chaiHttp = require('chai-http');
var server = require('../server/server');
var Const = require("../config/const.js");
var should = chai.should();
chai.use(chaiHttp);
var assert = chai.assert;
var column1value = "1234567890123456"
describe('All', function() {
it('Insert',function(done) {
chai.request(server)
.post('/' +Const.SERVER_NAME + '/insert')
.set('content-type', 'application/x-www-form-urlencoded')
.send({param1: column1value, param2: 'true'})
.end(function(err, res){
console.log(new Date().getTime() + "!1");
res.should.have.status(200);
done();
});
});
});

数据库管理器插入方法:

method.insert = function(param1, param2) {
openDb();
console.log("blabla1");
console.log("param1:" + param1 + ";param2:" + param2);
db.run("INSERT INTO mytable (column1, column2) values (?,?)",param1,param2, function(err) {
console.log("blabla2" + this);
if (err) {
console.log(err);
} else {
console.log("Successfuly updated: " + param1);
}
});
db.close();
console.log("blabla3");
};

当我运行"npm 测试"或"摩卡测试"时,我在控制台输出中得到什么:

blabla1
param1:1234567890123456;param2:真正的
blabla3
时间戳!1

如果我启动nodejs服务器并使用,比方说,邮递员,调用调用插入的API,数据入到数据库中并显示blabla2日志。 我错过了什么?

更新
这个问题与Alexandru Olaru所写的内容有关,但更具体地说,我在索引中做了.js(我的路线在哪里)

function insertOrUpdateData(req, res) {
databaseManager.insert(req.body.param1, req.body.param2);
res.end();
return;
};

但我需要做:

function insertOrUpdateData(req, res) {
databaseManager.insert(req.body.param1, req.body.param2, function (err) {
logger.log("*-*-router insert callback");
res.end();
return;
});
}

相关为什么这个问题只能在单元测试中重现,从我现在的理解来看,是因为异步任务毕竟是在节点中执行的,但在单元测试中却不是。为什么它不在单元测试中,我还不是很确定(可能与单元测试生命周期或与节点实例的交互有关)。

重构代码以使用回调或承诺:

method.insert = function (param1, param2) {
return new Promise((resolve, reject) => {
openDb();
db.run('INSERT INTO mytable (column1, column2) values (?,?)', param1, param2, (err) => {
db.close();
if (err) {
reject(err);
} else {
resolve();
}
});
});
};
handler.insert(param1, param2)
.then(() => { // the stuff after })
.catch((err) => { // handler error });

问题在于您没有为异步部分设置回调。

最新更新