我正在尝试围绕mongoose模型进行测试。
我使用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
}model/Test.js:
var mongoose = require('mongoose');
//Should not get called when proxyquired
module.exports = mongoose.model('Test', mongoose.Schema({
date: Date,
data: String
}));test/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);
}
});
});
//...我发现的另一种方法是在Test中使用proxyquire mongoose,并模仿它来阻止注册,但这将是大量的代码,我还有其他测试,这个模型被调用了4到5层深,所以代理查询每一层都会非常麻烦,而我可以模仿更高的函数。
https://stackoverflow.com/questions/38326012
复制相似问题