私はマングースモデルをテストしようとしています。
私は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し、それをモックして登録を防ぐことですが、それは多くのコードになり、このモデルが4層または5層の深さで呼び出される他のテストがあるため、すべてのレベルでproxyquiring高等関数をモックすることはできますが、本当に面倒です。