2016-07-12 33 views
0

我想測試一下貓鼬模型。阻止proxyquire調用原始代碼?

我用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貓鼬在測試,並嘲笑它,以防止註冊,但它會是很多的代碼,我有其他測試,這個模型得到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'工作,但試圖使用僅模塊版本(在proxyquire調用中'@noCallThru:true')不。 – 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代碼,並給它嘲笑的模型。