mock require of oracledb с использованием proxyquire для модульного тестирования приложения node.js - PullRequest
0 голосов
/ 15 ноября 2018

Пожалуйста, помогите решить проблему ниже:

Я пытаюсь выполнить модульное тестирование модуля dbAdapter с помощью mocha.

dbAdapter для подключения к оракулу и выполнения команд 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, чтобы я мог использовать свой смоделированный oracledbStub вместо oracledb в dbAdapter.js

Когда я запускаю модульный тест, я получаю следующую ошибку:

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 голосов
/ 15 ноября 2018

Если вы посмотрите на пример, на котором основан ваш код, вы заметите, что mongooseStub - это объект с методом model, который предназначен для переопределения метода model, который включен в Mongoose. Если этот метод не существует в заглушке, то вместо него будет использоваться метод из Mongoose.

В вашем случае вы определили oracleStub с объектом, который имеет функцию model. Однако у oracledb нет модельного метода - так что он ничего не собирается делать. Ваша заглушка должна включать функцию getConnection, поскольку вы пытаетесь переопределить ее из базового класса (oracledb).

Это будет сложно, так как вам потребуется заглушка для объекта подключения и его методов, например execute. Чем больше методов вы используете в реальной библиотеке, тем больше работы вам придется потушить.

Здесь есть похожий вопрос: Как заглушить oracledb с помощью sinon?

...