2016-07-12 8 views
0

Я пытаюсь проверить вокруг модели мангуста.Предотвратить проксисервирование для вызова исходного кода?

Я использую proxyquire глумиться его как единое целое, но так как в исходном файле регистрации модели, я получаю

OverwriteModelError: Cannot overwrite `EEG` model once compiled. 

Так как все, что нужно уже впрыскивается proxyquire, как я могу сказать ему, чтобы не нагружать модель ?

код для проверки:

var mongoose = require('mongoose'); 

var db = {}, 
    Test = require('./model/Test.js'), 
    config = require('./config.json'); 

var dbURL = config.medical.url, 
    dbName = config.medical.name; 

function connect(callback) { 
    db = mongoose.createConnection(dbURL + dbName); 
    db.on('error', (err) => { 
     callback(err); 
    }); 
    db.once('open', function() { 
     callback(); 
    }); 
} 

function save(data, callback) { 
    new Test({ 
     data 
    }).save((err) => { 
     callback(err); 
    }); 
} 

module.exports = { 
    connect: connect, 
    save: save 
} 

модель/Test.js:

var mongoose = require('mongoose'); 

//Should not get called when proxyquired 
module.exports = mongoose.model('Test', mongoose.Schema({ 
    date: Date, 
    data: String 
})); 

тест/test.js:

//... 
describe('save', (done) => { 
    it('Expect to successfully save the Test', (done) => { 
     var stub = { 
       Test: function Test() { 
        this.save = (callback) => { 
         callback(); 
        } 
       } 
      }, 
      test = proxyquire('./../test.js', { 
       './model/Test.js': stub.Test 
      }); 

     test.save({data: 'data'}, (err) => { 
      try { 
       expect(err).to.not.be.ok; 
       done(); 
      } catch(err) { 
       done(err); 
      } 
     }); 
    }); 

    it('Expect to throw any error raised', (done) => { 
     var stub = { 
       Test: function Test() { 
        this.save = (callback) => { 
         callback('ERROR'); 
        } 
       } 
      }, 
      //This line raise a error because Test is already compiled 
      test = proxyquire('./../test.js', { 
       './model/Test.js': stub.Test 
      }); 

     test.save({data: 'data'}, (err) => { 
      try { 
       expect(err).to.not.be.ok; 
       done(); 
      } catch(err) { 
       done(err); 
      } 
     }); 
    }); 
    //... 

альтернатива метод, который я нашел бы proxyquire mongoose в тесте и издеваться над ним, чтобы предотвратить регистрацию, но было бы много кода, и у меня есть другой тест, где эта модель получает c с 4 или 5 уровнями глубины, поэтому проксиурирование каждого уровня было бы очень громоздким, в то время как я мог бы высмеять функцию более высоких функций.

+0

@ S.D .: 'noCache' не задокументирован и не работает. Кроме того, я хочу сохранить 'callThru' для другой библиотеки, я хочу заблокировать вызов только на../Model/test.js' – DrakaSAN

+0

Его фактически' var proxyquire = require ('proxyquire'). NoPreserveCache(). noCallThru(); '. Я предполагаю, что для каждого требуемого тестового файла() proxyquire вы можете использовать 'noCallThru()' только для файла 'test.js'. –

+0

К сожалению, я уже использую '.noPreserveCache', чтобы я мог регенерировать свои модули в каждом тесте. Странная вещь: использование глобальной работы noCallThru, но попытка использовать только версию модуля ('@noCallThru: true' в вызове proxyquire) нет. – DrakaSAN

ответ

0

Возвращение после обнаружения обходного пути. Я поставил модель во внешнем файле, а затем использовал этот код для тестирования/test.js:

 let stub = { 
      mongoose: { 
       model:() => { 
        return function Test() { 
         this.save = (callback) => { 
          callback(); 
         } 
        } 
       }, 
       Schema:() => {} 
      } 
     }, 
     test = proxyquire('./../model/Test.js', { 
      'mongoose': stub.mongoose 
     }), 
     code = proxyquire('./../code.js', { 
      'mongoose': mongoose, 
      './model/Test.js': test 
     }); 

В основном proxyquire модель издеваться мангуста, затем proxyquire код и дать ему высмеивал модель.

 Смежные вопросы

  • Нет связанных вопросов^_^