使用proxyquire模拟oracledb的需求以对node.js应用程序进行单元测试

时间:2018-11-15 06:58:28

标签: node.js mocha proxyquire

请帮助解决以下问题:

我正在尝试使用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);
            }

        })
};

单元测试以测试选择查询:(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/

我相信我可能会缺少一些细节,并且从一天开始就被困住了。

1 个答案:

答案 0 :(得分:0)

如果查看基于代码的示例,您会注意到mongooseStub是带有model方法的对象,该方法旨在覆盖包含在猫鼬中。如果存根中不存在该方法,则将使用Mongoose中的方法。

在您的情况下,您已使用具有model功能的对象定义了oracleStub。但是,oracledb没有模型方法-因此不会做任何事情。您的存根中应包含一个model函数,因为这是您要从基类(oracledb)覆盖的函数。

这将变得棘手,因为您随后必须拥有连接对象及其方法(例如execute)的存根。您在实际库中使用的方法越多,将其全部处理掉的工作就越多。

这里有一个类似的问题:How to stub oracledb with sinon?