Grrrr just spent the better half of 2 hours trying to figure out why my Jest tests were not working for a Mongoose plugin I’m developing. It turns out that the schema configuration I was sharing between the tests was the culprit.
let Mongoose = require('mongoose');
let Schema = Mongoose.Schema;
const _ = require('lodash');
var mongooseI18n = require('../src/mongoose/mongoose-i18n-localize');
Mongoose.set('debug', true);
const simpleSchemaConfig = {
firstName: { type: String, i18n: true, required: true },
lastName: { type: String, i18n: false, required: true }
};
describe('Mongoose i18n localize', () => {
beforeEach(() => {
// Clear compiled models to avoid OverwriteModelError
Mongoose.models = {};
});
it('should throw an exception if the locales array is not defined', () => {
const SimpleTestSchema = new Schema(simpleSchemaConfig);
expect(() => {
SimpleTestSchema.plugin(mongooseI18n, {
defaultLocale: 'nl',
allLocalesRequired: false
});
}).toThrow('The required option locales array not provided or empty');
});
it('should throw an exception if the locales array is an empty array', () => {
const SimpleTestSchema = new Schema(simpleSchemaConfig);
expect(() => {
SimpleTestSchema.plugin(mongooseI18n, {
locales: [],
defaultLocale: 'nl',
allLocalesRequired: false
});
}).toThrow('The required option locales array not provided or empty');
});
...
});
The plugin makes changes to the schema configuration and these changes were made to the shared config. The fix I used was to make a copy of the shared config with lodash’s cloneDeep
function. The only change I needed to make was the schema initialization.
const SimpleTestSchema = new Schema(_.cloneDeep(simpleSchemaConfig));
Now my tests run like a charm 🙂
Bonus
When I initially ran into the above problem, I was also initializing the schema globally. I thought that was the problem, so I moved the following statement to each test case.
const SimpleTestSchema = new Schema(simpleSchemaConfig);
That caused the exception OverwriteModelError, because I was trying to initialize a compiled model. The fix for this problem was to remove all models between test cases using beforeEach
. The following code does the trick.
beforeEach(() => {
// Clear compiled models to avoid OverwriteModelError
Mongoose.models = {};
});
Hope this helps someone.