我正在尝试围绕猫鼬模型进行测试。
我使用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);
}
});
});
//...
我发现的另一种方法是在 Test 中代理 mongoose,并对其进行模拟以防止注册,但这将是很多代码,而且我还有其他测试,该模型被称为 4 或 5 层深,因此代理查询每个级别真的很麻烦,而我可以模拟更高的功能。