使用 proxyquire 对 oracledb 进行模拟要求以单元测试 node.js 应用程序
mock require of oracledb using proxyquire to unit test node.js app
请帮助解决以下问题:
我正在尝试使用 mocha 对 dbAdapter 模块进行单元测试。
dbAdapter 连接到 oracle 并执行 sql 命令 (dbAdapter.js)
const oracledb = require('oracledb');
let doConnect = function(callback) {
oracledb.getConnection(config, callback);
};
let execute_selectquery = function(query, results) {
this.query = query;
this.execute = function(connection, callback) {
connection.execute(query, function(err, result) {
if (err) {
return callback(err);
}else {
callback(result);
}
})
};
单元测试来测试 select 查询: (test.js)
describe(`test proxyquire`, function() {
const proxyquire = require('proxyquire')
let dbAdapter
let oracledbStub;
before(function() {
oracledbStub = {
model: function() {
return {
updateDb: function(id, first, last, callback) {
callback(null, 'done');
}
};
}
};
dbAdapter = proxyquire('../controllers/dbAdapter.js', {'oracledb': oracledbStub});
});
it.only(`test route`, function(done) {
let query = "select * from users";
db.execute_selectquery(query, function(err, result){
console.log(result)
})
})
})
在上面的单元测试中,我使用了 proxyquire,这样我就可以在 dbAdapter.js
中使用模拟的 oracledbStub 而不是 oracledb
当我 运行 单元测试时出现以下错误:
Uncaught TypeError: Illegal invocation
at Function.getConnection (node_modules/oracledb/lib/oracledb.js:295:10)
at Function.getConnection (node_modules/oracledb/lib/util.js:99:19)
at doConnect (controllers/dbConnection/oracleAdapter.js:47:14)
at fn (node_modules/async/lib/async.js:641:34)
at Immediate.<anonymous> (node_modules/async/lib/async.js:557:34)
我关注了以下博客:
http://www.devblogrbmz.com/nodejs-mocking-with-proxyquire/
我想我可能遗漏了一些细节,并且从一天开始就一直卡住了。
如果您查看代码所基于的示例,您会注意到 mongooseStub
是一个具有 model
方法的对象,该方法旨在覆盖 model
Mongoose 附带的方法。如果存根上不存在该方法,则将使用 Mongoose 中的方法。
在您的例子中,您已经使用具有 model
函数的对象定义了 oracleStub
。但是,oracledb 没有模型方法 - 所以它不会做任何事情。您的存根应该包含一个 getConnection
函数,因为这是您试图从基础 class (oracledb).
覆盖的函数
这将变得棘手,因为您必须为连接对象及其方法(如执行)创建一个存根。您在实际库中使用的方法越多,您将需要完成的工作就越多。
这里有一个类似的问题:
请帮助解决以下问题:
我正在尝试使用 mocha 对 dbAdapter 模块进行单元测试。
dbAdapter 连接到 oracle 并执行 sql 命令 (dbAdapter.js)
const oracledb = require('oracledb');
let doConnect = function(callback) {
oracledb.getConnection(config, callback);
};
let execute_selectquery = function(query, results) {
this.query = query;
this.execute = function(connection, callback) {
connection.execute(query, function(err, result) {
if (err) {
return callback(err);
}else {
callback(result);
}
})
};
单元测试来测试 select 查询: (test.js)
describe(`test proxyquire`, function() {
const proxyquire = require('proxyquire')
let dbAdapter
let oracledbStub;
before(function() {
oracledbStub = {
model: function() {
return {
updateDb: function(id, first, last, callback) {
callback(null, 'done');
}
};
}
};
dbAdapter = proxyquire('../controllers/dbAdapter.js', {'oracledb': oracledbStub});
});
it.only(`test route`, function(done) {
let query = "select * from users";
db.execute_selectquery(query, function(err, result){
console.log(result)
})
})
})
在上面的单元测试中,我使用了 proxyquire,这样我就可以在 dbAdapter.js
中使用模拟的 oracledbStub 而不是 oracledb当我 运行 单元测试时出现以下错误:
Uncaught TypeError: Illegal invocation
at Function.getConnection (node_modules/oracledb/lib/oracledb.js:295:10)
at Function.getConnection (node_modules/oracledb/lib/util.js:99:19)
at doConnect (controllers/dbConnection/oracleAdapter.js:47:14)
at fn (node_modules/async/lib/async.js:641:34)
at Immediate.<anonymous> (node_modules/async/lib/async.js:557:34)
我关注了以下博客: http://www.devblogrbmz.com/nodejs-mocking-with-proxyquire/
我想我可能遗漏了一些细节,并且从一天开始就一直卡住了。
如果您查看代码所基于的示例,您会注意到 mongooseStub
是一个具有 model
方法的对象,该方法旨在覆盖 model
Mongoose 附带的方法。如果存根上不存在该方法,则将使用 Mongoose 中的方法。
在您的例子中,您已经使用具有 model
函数的对象定义了 oracleStub
。但是,oracledb 没有模型方法 - 所以它不会做任何事情。您的存根应该包含一个 getConnection
函数,因为这是您试图从基础 class (oracledb).
这将变得棘手,因为您必须为连接对象及其方法(如执行)创建一个存根。您在实际库中使用的方法越多,您将需要完成的工作就越多。
这里有一个类似的问题: