Skip to content

Latest commit

 

History

History
145 lines (110 loc) · 4.25 KB

File metadata and controls

145 lines (110 loc) · 4.25 KB
id title
test-runners
Integration with Test Runners

This Guide will show how mongodb-memory-server can be used with different frameworks

jest

jest version 29

For usage with jest it is recommended to use the globalSetup and globalTeardown options

config.ts:

// this file could be anything (like a json directly imported)

export = {
  Memory: true,
  IP: '127.0.0.1',
  Port: '27017',
  Database: 'somedb'
}

jest.config.json:

{
  "preset": "ts-jest",
  "globalSetup": "<rootDir>/test/globalSetup.ts",
  "globalTeardown": "<rootDir>/test/globalTeardown.ts",
  "setupFilesAfterEnv": [
    "<rootDir>/test/setupFile.ts"
  ]
}

globalSetup.ts:

import { MongoMemoryServer } from 'mongodb-memory-server';
import * as mongoose from 'mongoose';
import { config } from './utils/config';

export = async function globalSetup() {
  if (config.Memory) { // Config to decide if an mongodb-memory-server instance should be used
    // it's needed in global space, because we don't want to create a new instance every test-suite
    const instance = await MongoMemoryServer.create();
    const uri = instance.getUri();
    (global as any).__MONGOINSTANCE = instance;
    process.env.MONGO_URI = uri.slice(0, uri.lastIndexOf('/'));
  } else {
    process.env.MONGO_URI = `mongodb://${config.IP}:${config.Port}`;
  }

  // The following is to make sure the database is clean before an test starts
  const conn = await mongoose.connect(`${process.env.MONGO_URI}/${config.Database}`);
  await conn.connection.db.dropDatabase();
  await mongoose.disconnect();
};

globalTeardown.ts:

import { MongoMemoryServer } from 'mongodb-memory-server';
import { config } from './utils/config';

export = async function globalTeardown() {
  if (config.Memory) { // Config to decide if an mongodb-memory-server instance should be used
    const instance: MongoMemoryServer = (global as any).__MONGOINSTANCE;
    await instance.stop();
  }
};

and an setupFilesAfterEnv can be used to connect something like mongoose or mongodb

setupFile.ts:

beforeAll(async () => {
  // put your client connection code here, example with mongoose:
  await mongoose.connect(process.env['MONGO_URI']);
});

afterAll(async () => {
  // put your client disconnection code here, example with mongodb:
  await mongoose.disconnect();
});

:::caution It is very important to limit the spawned number of Jest workers on machines that have many cores, because otherwise the tests may run slower than with fewer workers, because the database instance(s) may be hit very hard.
Use either --maxWorkers 4 or --runInBand to limit the workers. :::

:::note Keep in mind that jest's global-setup and global-teardown do not share a environment with the tests themself, and so require setupFile / setupFilesAfterEnv to actually connect. :::

mocha / chai

mocha version (unknown)

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

import mongoose from 'mongoose';
import { MongoMemoryServer } from 'mongodb-memory-server';

let mongoServer;
const opts = { useMongoClient: true }; // remove this option if you use mongoose 5 and above

before(async () => {
  mongoServer = await MongoMemoryServer.create();
  const mongoUri = mongoServer.getUri();
  await mongoose.connect(mongoUri, opts);
});

after(async () => {
  await mongoose.disconnect();
  await mongoServer.stop();
});

describe('...', () => {
  it('...', async () => {
    const User = mongoose.model('User', new mongoose.Schema({ name: String }));
    const cnt = await User.count();
    expect(cnt).to.equal(0);
  });
});

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

:::note Note that this mentioned tutorial is pre 7.x :::