防止proxyquire调用原代码?
Prevent proxyquire to call original code?
我正在尝试围绕猫鼬模型进行测试。
我是用proxyquire整体mock的,但是由于原文件注册了模型,所以得到
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);
}
});
});
//...
我发现的另一种方法是在测试中使用 proxyquire mongoose,并模拟它以防止注册,但这会需要很多代码,而且我还有其他测试,该模型被称为 4 或 5 层深, 所以proxyquiring每一级真的很麻烦,而我可以模拟更高的功能。
找到解决方法后回来。我将模型放在外部文件中,然后将此代码用于 test/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整体mock的,但是由于原文件注册了模型,所以得到
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);
}
});
});
//...
我发现的另一种方法是在测试中使用 proxyquire mongoose,并模拟它以防止注册,但这会需要很多代码,而且我还有其他测试,该模型被称为 4 或 5 层深, 所以proxyquiring每一级真的很麻烦,而我可以模拟更高的功能。
找到解决方法后回来。我将模型放在外部文件中,然后将此代码用于 test/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
});
基本上代理查询模型来模拟猫鼬,然后代理查询代码并给它模拟模型。