🌥

prismaのmiddlewareでモックを返してテストする

2022/08/04に公開

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にはargsactionなど一通りのパラメータが入ってきているので、条件に合わせてmockを返すなども可能そうだ

GitHubで編集を提案

Discussion