Nodejs摩卡unit testingsqlite3callback未调用插入未执行

我想为我的应用程序创buildunit testing。 当通过浏览器调用API时,API工作得很好,但是当我想要执行testing时,无论是使用npm test还是mocha test,都不会调用callback函数,也不会执行INSERT语句。 我没有错误。 码:

unit testing文件:

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

数据库pipe理器插入方法

 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 test”或“mocha test”时,我在控制台输出中得到了什么:

blabla1
参数1:1234567890123456;参数2:真
blabla3
时间戳!1

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

UPDATE
这个问题与亚历山德鲁·奥拉鲁(Alexandru Olaru)写的有关,但是更具体的说,我在做index.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; }); } 

这就是为什么这个问题只能在unit testing中重现,而我现在所理解的是因为asynchronous任务毕竟是在节点中执行的,但是在unit testing中却不是这样。 为什么不在unit testing中,我还不是很确定(可能与unit testing生命周期或与节点实例的交互有关)。

重构您的代码以使用callback或承诺:

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

问题在于你没有为asynchronous部分设置callback。