Testing Prisma Applications

1. Setting Up Test Database

StrategyDetail
Docker PostgresPer-CI ephemeral DB
SQLite memoryfile::memory:?cache=shared
BranchingNeon/PlanetScale branches

2. Mocking Prisma Client

import { mockDeep, DeepMockProxy } from "jest-mock-extended";
import { PrismaClient } from "@prisma/client";
export const prismaMock = mockDeep<PrismaClient>() as DeepMockProxy<PrismaClient>;
ToolDetail
jest-mock-extendedType-safe deep mocks
vitest-mock-extendedVitest equivalent

3. Using Test Containers

LibraryDetail
testcontainersSpawn Postgres container
Lifecyclestart → migrate → run tests → stop

4. Implementing Integration Tests

beforeAll(async () => { await prisma.$executeRawUnsafe(`TRUNCATE "User" CASCADE`); });
test("creates user", async () => {
  const u = await prisma.user.create({ data: { email: "a@b.io" } });
  expect(u.id).toBeDefined();
});
PatternDetail
TruncateFast reset between suites
TransactionalBegin/rollback per test

5. Using Transactional Tests

AspectDetail
PatternWrap test in $transaction + throw to rollback
CaveatCode under test cannot start its own tx

6. Seeding Test Data

ApproachDetail
FactoriesPer-test custom data
FixturesStatic JSON
Seed scriptShared baseline

7. Cleaning Test Data

MethodDetail
TRUNCATE CASCADEFastest for PG
deleteManyPortable across DBs
Drop+migrateHeavy but pristine

8. Testing Migrations

PracticeDetail
CI runmigrate deploy on shadow DB
Round-tripdiff old→new yields no drift

9. Implementing E2E Tests

ToolDetail
PlaywrightBrowser-driven
SupertestHTTP-level
Ephemeral envDocker compose

10. Using Coverage Tools

ToolDetail
c8Native V8 coverage
vitest --coverageBuilt-in via c8/istanbul
CodecovSaaS reporting