🌥
prismaのmiddlewareでモックを返してテストする
Prismaの絡む部分でテストしたい時にMiddlewareの機能を使えばテスト用DBやjestのmockなど使えばできることがわかった。
例
テスト対象になる関数は下記のようにPrismaClient
を引数に取るようにしておくと都合が良い
// task.ts
import { PrismaClient } from '@prisma/client'
export const getTaskById = (prisma: PrismaClient, id: string) => {
return prisma.task.findUnique({ where: { id } })
}
あとは$use
にてMiddlewareを設定したprismaClientを使うようにすると良い
// task.test.ts
const mockedPrismaClient = () => {
const prismaClient = new PrismaClient()
prismaClient.$use(async (params, next) => {
return {
id: "foo",
name: "hoge"
} as Task
})
return prismaClient
}
test("Task test", async () => {
const prismaClient = mockedPrismaClient()
const task = await getTaskById(prismaClient, "foo")
expect(task?.name).toBe("hoge")
})
例えばTask
のテーブルはmockを返してそれ以外は普通に処理させたいという場合はこのような感じで可能
prismaClient.$use(async (params, next) => {
if (params.model === "Task") {
return {
id: "a",
name: "hoge"
} as Task
}
return await next(params)
})
他にもparams
にはargs
やaction
など一通りのパラメータが入ってきているので、条件に合わせてmockを返すなども可能そうだ
Discussion