A comprehensive mock of the Prisma API intended for unit testing. All data is stored in memory, providing fast and reliable test execution without external dependencies.
The library uses jest-mock-extended
or vitest-mock-extended
, which means that if functionality you need is not implemented yet, you can mock it yourself.
npm install prisma-mock --save-dev
# or
yarn add prisma-mock --dev
Simple example of how to create a prisma mock instance:
import createPrismaMock from "prisma-mock"
let client
beforeEach(() => {
client = createPrismaMock()
})
Example of how to mock a global prisma instance, as the default export in a "db" directory (like BlitzJS):
import createPrismaMock from "prisma-mock"
import { mockDeep, mockReset } from "jest-mock-extended"
jest.mock("db", () => ({
__esModule: true,
...jest.requireActual("db"),
default: mockDeep(),
}))
import db, { Prisma } from "db"
beforeEach(() => {
mockReset(db)
createPrismaMock({}, Prisma.dmmf.datamodel)
})
You can optionally start with pre-filled data:
const client = createPrismaMock({
user: [
{
id: 1,
name: "John Doe",
accountId: 1,
},
],
account: [
{
id: 1,
name: "Company",
},
],
})
createPrismaMock(
data: PrismaMockData<P> = {},
datamodel?: Prisma.DMMF.Datamodel,
client = mockDeep<P>(),
options: {
caseInsensitive?: boolean
enableIndexes?: boolean
} = {}
): Promise<P>
Initial mock data for the Prisma models. An object containing keys for tables and values as arrays of objects.
The Prisma datamodel, typically Prisma.dmmf.datamodel
. Defaults to the current Prisma client's datamodel.
A jest-mock-extended
instance. If not provided, a new instance is created.
Configuration options for the mock client:
-
caseInsensitive
(boolean, default:false
): If true, all string comparisons are case insensitive -
enableIndexes
(boolean, default:false
) Experimental: If true, enables indexing for better query performance on primary keys, unique fields, and foreign keys
Returns a mock Prisma client with all standard model methods plus:
-
$getInternalState()
: Method to access the internal data state for testing/debugging
-
findUnique
/findUniqueOrThrow
findMany
-
findFirst
/findFirstOrThrow
create
createMany
delete
update
deleteMany
updateMany
upsert
count
aggregate
distinct
include
where
select
orderBy
select: _count
create
createMany
update
updateMany
delete
deleteMany
connect
disconnect
set
upsert
equals
-
gt
,gte
,lt
,lte
not
-
in
,notIn
-
contains
,startsWith
,endsWith
-
AND
,OR
,NOT
-
mode
(for case-insensitive matching)
some
every
none
increment
decrement
multiply
divide
set
path
string_contains
string_starts_with
string_ends_with
array_contains
array_starts_with
array_ends_with
-
@@id
(Primary keys) -
@default
(Default values) -
@unique
(Unique constraints) -
@@unique
(Compound unique constraints) -
@relation
(Relationships) -
@updatedAt
(Partially supported - set at creation)
autoincrement()
cuid()
uuid()
now()
onDelete: SetNull
onDelete: Cascade
-
$transaction
(Array of promises) -
$transaction
(Interactive transactions with rollback) $connect
$disconnect
The following features are planned but not yet implemented:
groupBy
connectOrCreate
-
search
(Full-text search)
is
set
push
has
hasEvery
hasSome
isEmpty
equals
auto()
dbgenerated()
onDelete: Restrict
onDelete: NoAction
onDelete: SetDefault
-
onUpdate
actions
-
$transaction
(Isolation levels) -
$use
(Middleware)
Enable indexing for better query performance:
const client = createPrismaMock({}, undefined, undefined, {
enableIndexes: true,
})
When enabled, indexes are automatically created for:
- Primary key fields
- Unique fields
- Foreign key fields
This can significantly improve query performance for large datasets.
The mock client throws appropriate Prisma errors with correct error codes:
-
P2025
: Record not found (forfindUniqueOrThrow
,findFirstOrThrow
) -
P2002
: Unique constraint violation -
P2003
: Foreign key constraint violation
Create your tests in the __tests__
directory. You can use snapshot testing with either expect(res).toMatchSnapshot()
or expect(res).toMatchInlineSnapshot()
.
Note: If you choose to use snapshot testing, make sure to first run your tests against the real database to create a snapshot of the expected result.
To run tests against a PostgreSQL database:
yarn run test:postgres
To run tests against prisma-mock (in-memory database):
yarn test
Create a .env-cmdrc
file in the root of your project with the following content:
{
"postgres": {
"PROVIDER": "postgresql",
"DATABASE_URL": "postgresql://postgres:postgres@localhost:5432/postgres?schema=public"
}
}
yarn build
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
MIT