имитировать требование oracledb с использованием proxyquire для модульного тестирования приложения node.js

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

Я пытаюсь провести модульное тестирование модуля 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/

Я считаю, что могу упустить какую-то деталь и застрял со дня.


person MANOJ    schedule 15.11.2018    source источник


Ответы (1)


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

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

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

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

person Dan McGhan    schedule 15.11.2018