我正在尝试为我的node.js代码编写单元测试。我能够为函数编写测试但我想测试每个网络查询(查询从数据库中获取数据)是否返回所需的响应。 我正在共享我的node.js代码以及我的测试代码。
node.js code(routes.js)
module.exports = {
getUser: {
get: function(req, parameters, environment) {
var id = req.queryString.id;
return new Promise(function(resolve, reject) {
db.tx(t =>{
return t.one("select configuration_value from fint.configuration where configuration_key='LOAN' and application_id =(select application_id from fint.application where application_name='Product Tailoring')")
})
.then(conf => {
conf_key = conf.configuration_value;
})
db.tx(t =>{
return t.one("select smart_account_type_id from fint.smart_account_type where smart_account_type_name='LOAN'")
})
.then(acc_type => {
smart_acc_type_id = acc_type.smart_account_type_id;
})
}
})
}
}
这是一个示例代码,我想要的是对各个查询而不是整个函数运行测试。
我的测试代码(test.js)
var expect = require('chai').expect;
var Promise = require('bluebird');
var chai = require('chai');
var app = require('../api/smartAccount/identifyLoan/getDirectDebitTrans/routes');
describe("Unit testing for function", function(){
it("Testing the function using mocha", function(done){
var req = {
queryString: {
uniqueUserId: 101
}
};
var test = app.getUser.get(req);
return expect(Promise.resolve(test)).to.have.property('_bitField');
done();
});
});
任何潜在客户都将受到赞赏,如果有人发现某些相关链接,请分享。 TIA
答案 0 :(得分:1)
首先,如果你想分别测试每个查询,我会重构代码并将每个查询包装在一个单独的函数中。因此,您将能够对实际单位进行单元测试。如果您无法轻松测试应用程序的一部分,可能是因为某些内容设计不正确。顺便说一句,你返回一个永远不会解决(或拒绝)的承诺!?
关于使用承诺功能的单元测试,您可以尝试co-mocha。使用这样的流程控制框架将使您的承诺测试更具可读性。
module.exports = {
getUser: {
get: function(req, parameters, environment) {
var id = req.queryString.id;
return new Promise(function(resolve, reject) {
getConfKey(id)
.then(confKey => {
getAccType(id)
.then(accType => {
resolve({key: confKey, type: accType})
})
})
})
})
getConfKey: function(id) {
return new Promise(function(resolve, reject) {
db.tx(t =>{
return t.one("select configuration_value from fint.configuration where configuration_key='LOAN' and application_id =(select application_id from fint.application where application_name='Product Tailoring')")
})
.then(conf => {
resolve(conf.configuration_value);
})
})
}
getAccType: function(id) {
return new Promise(function(resolve, reject) {
db.tx(t =>{
return t.one("select smart_account_type_id from fint.smart_account_type where smart_account_type_name='LOAN'")
})
.then(acc_type => {
resolve(acc_type.smart_account_type_id);
})
})
}
}
}
当然,这是一个例子。如果两个函数都是独立的,则可以同时执行这些函数。并发不是这个问题的重点。