Nodejs mocha单元测试sqlite3回调未调用插入未执行
Nodejs mocha unit test sqlite3 callback not called insert not executed
我想为我的应用创建单元测试。 API 在通过浏览器调用时工作得很好,但是当我想执行测试时,无论是使用 npm 测试还是 mocha 测试,都不会调用回调函数并且不会执行 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 test" 或 "mocha test":
时,我在控制台输出中得到了什么
blabla1[=33=]
param1:1234567890123456;参数 2:true
blabla3
时间戳!1
如果我启动 nodejs 服务器并使用,比方说,邮递员,调用调用插入的 API,数据将插入数据库并显示 blabla2 日志。
我错过了什么?
更新
问题与 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;
});
}
关于为什么问题只在单元测试中重现,我现在的理解是因为异步任务毕竟是在节点中执行的,但在单元测试中却不是。为什么它不在单元测试中,我还不是很确定(可能与单元测试生命周期或与节点实例的交互有关)。
重构您的代码以使用回调或承诺:
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 });
问题在于您没有为异步部分设置回调。
我想为我的应用创建单元测试。 API 在通过浏览器调用时工作得很好,但是当我想执行测试时,无论是使用 npm 测试还是 mocha 测试,都不会调用回调函数并且不会执行 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 test" 或 "mocha test":
时,我在控制台输出中得到了什么blabla1[=33=]
param1:1234567890123456;参数 2:true
blabla3
时间戳!1
如果我启动 nodejs 服务器并使用,比方说,邮递员,调用调用插入的 API,数据将插入数据库并显示 blabla2 日志。 我错过了什么?
更新
问题与 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;
});
}
关于为什么问题只在单元测试中重现,我现在的理解是因为异步任务毕竟是在节点中执行的,但在单元测试中却不是。为什么它不在单元测试中,我还不是很确定(可能与单元测试生命周期或与节点实例的交互有关)。
重构您的代码以使用回调或承诺:
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 });
问题在于您没有为异步部分设置回调。