vitest-mms
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: {
mongodbMemoryServer: {
},
},
},
});
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: {
mongodbMemoryServerOptions: {
},
},
},
});
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:
import { mssTest } from "vitest-mms/mongodb/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