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.