Skip to content

danielpza/vitest-mms

Repository files navigation

vitest-mms NPM Version

mongodb-memory-server integration for vitest

  • mongodb driver support.
  • mongoose support.
  • clear database between each test
  • ootb ready to start writting tests

If you need support for other ORMs, please open an issue or a pull request. See ./tests for more examples.

Tip

You can also connect to the mongodb memory server directly by using a connection uri const connectionUri = inject("MONGO_URI");

Installation

npm install -D vitest-mms mongodb-memory-server
yarn add -D vitest-mms mongodb-memory-server
pnpm add -D vitest-mms mongodb-memory-server

Usage with mongodb

Important

You need to install mongodb separately.

To make it available in the global context for every test you need to add a globalSetup and setupFile in your vitest config:

vitest.config.mjs:

import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetup"],
    setupFiles: ["vitest-mms/mongodb/setupFile"],
    vitestMms: {
      // optional configuration
      mongodbMemoryServer: {
        // these options are passed to MongoMemoryServer.create(), see https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#normal-server
      },
    },
  },
});

tsconfig.json:

{
  "compilerOptions": {
    "types": ["vitest-mms/mongodb/setupFile"]
  }
}

index.test.js:

import { test } from "vitest";

test("my test", async ({ db, mongoClient }) => {
  const users = db.collection("users");
  users.insertOne({ name: "John" });
  expect(await users.countDocuments()).toBe(1);
});
  • mongoClient is the connected MongoClient instance (see import("mongodb").MongoClient)
  • db is a random database name connected to the mongodb-memory-server instance (see import("mongodb").Db)

Usage with mongoose

Important

You need to install mongoose separately.

vitest.config.mjs:

import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetup"],
    setupFile: ["vitest-mms/mongoose/setupFile"],
    vitestMms: {
      // optional configuration
      mongodbMemoryServerOptions: {
        // these options are passed to MongoMemoryServer.create(), see https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#normal-server
      },
    },
  },
});

tsconfig.json:

{
  "compilerOptions": {
    "types": ["vitest-mms/mongoose/setupFile"]
  }
}

index.test.js:

test("my test", async ({ connection }) => {
  const User = connection.model("User", new Schema({ name: String }));
  await User.create({ name: "John" });
  expect(await User.countDocuments()).toBe(1);
});

Using ReplSet

See https://typegoose.github.io/mongodb-memory-server/docs/guides/quick-start-guide#replicaset

vitest.config.mjs:

import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetupReplSet"],
    setupFiles: ["vitest-mms/mongodb/setupFile"],
    vitestMms: {
      mongodbMemoryServerOptions: {
        replSet: { count: 4 },
      },
    },
  },
});

Alternative using a extended test context

If you want to avoid the overhead of vitest-mms on every test and instead just want to use it for a subset of your tests, you can use vitest-mms/*/test instead:

vitest.config.mjs:

import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetup"],
  },
});

index.test.js:

// using the extended test context
import { mssTest } from "vitest-mms/mongodb/test";
// or import { mssTest } from "vitest-mms/mongoose/test";

mssTest("my test", async ({ db, mongoClient }) => {
  const users = db.collection("users");
  users.insertOne({ name: "John" });
  expect(await users.countDocuments()).toBe(1);
});

See https://vitest.dev/guide/test-context.html#extend-test-context for more information