First, we use mongodb-memory-server to create an in-memory mongodb instance, then start an instance of the PrismaClient connected to it, finally pass the instance of PrismaClient to the service class that would use the client to make database calls.
// testUtil.ts
import { MongoMemoryServer } from 'mongodb-memory-server';
export const createMemoryMongoDbServer = async () => {
const mongod = await MongoMemoryServer.create();
const uri = mongod.getUri();
const uriWithDb = uri + 'testDb';
const stopServer = async () => {
return mongod.stop();
};
return { stopServer, dbUrl: uriWithDb };
};
export const createTestPrismaClient = async () => {
const { stopServer, dbUrl } = await createMemoryMongoDbServer();
const prismaClient = new PrismaClient({ datasources: { db: { url: dbUrl } } });
await prismaClient.$connect();
return { stopServer, prismaClient };
};
import { createTestPrismaClient} from './testUtil';
import { PrismaClient } from '@prisma/client';
describe('my service', () => {
let stopServer: () => Promise<boolean>;
let prismaClient: PrismaClient;
beforeEach(async () => {
const result = await createTestPrismaClient();
stopServer = result.stopServer;
prismaClient = result.prismaClient;
});
afterEach(async () => {
await stopServer();
});
test('my first test', async () => {
// dependency inject the mocked `prismaClient` to the service
const myService = new MySerivce(prismaClient)
// insert mock data
// doing assertion
})
});