【发布时间】:2017-03-21 10:50:48
【问题描述】:
我想为我的应用创建单元测试。该 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 test”或“mocha test”时,我在控制台输出中得到了什么:
blabla1
参数1:1234567890123456;参数2:真
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;
});
}
从我现在的理解来看,为什么问题只能在单元测试中重现的相关原因是异步任务毕竟是在节点中执行的,但在单元测试中却不是。为什么它不在单元测试中,我还不太确定(可能与单元测试生命周期或与节点实例的交互有关)。
【问题讨论】:
-
db run 是一个异步调用...您需要 a) 从该函数返回一个承诺,或 b) 将回调传递给函数
-
您的行为似乎类似于异步问题。为什么它在邮递员 v chai 中有效,我不知道...也许是种族问题
-
另外,请查看github.com/mapbox/node-sqlite3#usage。他们在示例中调用了序列化代码块,这与您避免异步问题不同。
-
我在白底白字上写过,这在使用服务器时有效,但在单元测试时无效。
标签: node.js unit-testing sqlite mocha.js chai