2016-07-12 31 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代码,并给它嘲笑的模型。