Need help with jest-mongodb?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

shelfio
409 Stars 57 Forks MIT License 571 Commits 27 Opened issues

Description

Jest preset for MongoDB in-memory server

Services available

!
?

Need anything else?

Contributors list

jest-mongodb CircleCI npm (scoped)

Jest preset to run MongoDB memory server

Usage

0. Install

$ yarn add @shelf/jest-mongodb --dev

Make sure

mongodb
is installed in the project as well, as it's required as a peer dependency.

1. Create
jest.config.js

module.exports = {
  preset: '@shelf/jest-mongodb',
};

If you have a custom

jest.config.js
make sure you remove
testEnvironment
property, otherwise it will conflict with the preset.

2. Create
jest-mongodb-config.js

See mongodb-memory-server

module.exports = {
  mongodbMemoryServerOptions: {
    binary: {
      version: '4.0.3',
      skipMD5: true,
    },
    autoStart: false,
    instance: {},
  },
};

To use the same database for all tests pass the config like this:

module.exports = {
  mongodbMemoryServerOptions: {
    binary: {
      version: '4.0.3',
      skipMD5: true,
    },
    instance: {
      dbName: 'jest',
    },
    autoStart: false,
  },
};

To use separate database for each jest worker pass the

useSharedDBForAllJestWorkers: false
(doesn't create
process.env
variable when using this option):
module.exports = {
  mongodbMemoryServerOptions: {
    binary: {
      skipMD5: true,
    },
    autoStart: false,
    instance: {},
  },

useSharedDBForAllJestWorkers: false, };

To use dynamic database name you must pass empty object for instance field:

module.exports = {
  mongodbMemoryServerOptions: {
    binary: {
      version: '4.0.3',
      skipMD5: true,
    },
    instance: {},
    autoStart: false,
  },
};

To use another uri environment variable name you must set mongoURLEnvName field:

module.exports = {
  mongodbMemoryServerOptions: {
    binary: {
      version: '4.0.3',
      skipMD5: true,
    },
    instance: {},
    autoStart: false,
  },
  mongoURLEnvName: 'MONGODB_URI',
};

3. Configure MongoDB client

Library sets the

process.env.MONGO_URL
for your convenience, but using of
global.__MONGO_URI__
is preferable as it works with
useSharedDBForAllJestWorkers: false
const {MongoClient} = require('mongodb');

describe('insert', () => { let connection; let db;

beforeAll(async () => { connection = await MongoClient.connect(global.__MONGO_URI__, { useNewUrlParser: true, useUnifiedTopology: true, }); db = await connection.db(); });

afterAll(async () => { await connection.close(); }); });

4. PROFIT! Write tests

it('should insert a doc into collection', async () => {
  const users = db.collection('users');

const mockUser = {_id: 'some-user-id', name: 'John'}; await users.insertOne(mockUser);

const insertedUser = await users.findOne({_id: 'some-user-id'}); expect(insertedUser).toEqual(mockUser); });

Cache MongoDB binary in CI by putting this folder to the list of cached paths:

./node_modules/.cache/mongodb-memory-server/mongodb-binaries

You can enable debug logs by setting environment variable

DEBUG=jest-mongodb:*

5. Clean collections before each test (optional)

beforeEach(async () => {
  await db.collection('COLLECTION_NAME').deleteMany({});
});

See this issue for discussion

6. Jest watch mode gotcha

This package creates the file

globalConfig.json
in the project root, when using jest
--watch
flag, changes to
globalConfig.json
can cause an infinite loop

In order to avoid this unwanted behaviour, add

globalConfig
to ignored files in watch mode in the Jest configuation
// jest.config.js
module.exports = {
  watchPathIgnorePatterns: ['globalConfig'],
};

See Also

Publish

$ git checkout master
$ yarn version
$ yarn publish
$ git push origin master --tags

License

MIT © Shelf

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.