Skip to content

danielpza/vitest-mms

Repository files navigation

vitest-mms NPM Version

mongodb-memory-server integration for vitest

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

General Usage

// tsconfig.json
{
  "compilerOptions": {
    "types": ["vitest-mms/globalSetup"]
  }
}
// vitest.config.mjs
import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetup"],
  },
});
// index.test.js
import { inject, test } from "vitest";

const MONGO_URI = inject("MONGO_URI");

test("some test", () => {
  // use mongodb/mongoose/other packages to connect to mongodb using MONGO_URI
});

Usage with mongodb

Important

You need to install mongodb separately.

Manual Setup

// index.test.js
import { inject, test } from "vitest";
import { MongoClient } from "mongodb";

const MONGO_URI = inject("MONGO_URI");
const mongoClient = new MongoClient(MONGO_URI);

beforeAll(async () => {
  await mongoClient.connect();
  return () => mongoClient.disconnect();
});

test("some test", async () => {
  const db = mongoClient.db("my-db");
  // rest of the test
});

Using extended context

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

// index.test.js
import { mssTest } from "vitest-mms/mongodb/test";

mssTest("another test", ({ db, mongoClient }) => {
  // rest of the test
});
  • db is cleared after each test

Usage with mongoose

Important

You need to install mongoose separately.

Manual Setup (mongoose)

// index.test.js
import { inject, test } from "vitest";
import { createConnection } from "mongoose";

const MONGO_URI = inject("MONGO_URI");
let connection;

beforeAll(async () => {
  connection = await createConnection(MONGO_URI).asPromise();
  return () => connection.close();
});

test("some test", async () => {
  const dbConnection = connection.useDb("my-db");
  // rest of the test
});

Using extended context (mongoose)

import { mssTest } from "vitest-mms/mongoose/test";

// 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"],
    vitestMms: {
      mongodbMemoryServerOptions: {
        replSet: { count: 4 },
      },
    },
  },
});

Legacy setup files

Warning

Although convenient, these helpers have been deprecated since they rely on vitest beforeEach/afterEach hooks which are marked as deprecated by vitest

// vitest.config.mjs
import { defineConfig } from "vitest/config";

export default defineConfig({
  test: {
    globalSetup: ["vitest-mms/globalSetup"],
    setupFiles: ["vitest-mms/mongodb/setupFile"], // or vitest-mms/mongoose/setupFile
  },
});
// tsconfig.json
{
  "compilerOptions": {
    "types": [
      "vitest-mms/globalSetup",
      // or "vitest-mms/mongoose/setupFile"
      "vitest-mms/mongodb/setupFile"
    ]
  }
}
import { test, expect } from "vitest";

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

// or with mongoose
// test("my test", async ({connection }) => { ... })
  • database is cleared before each test

About

mongodb-memory-server integration for vitest

Topics

Resources

License

Stars

Watchers

Forks

Sponsor this project

 

Contributors 3

  •  
  •  
  •