jestでprismaを使用したdbアクセスをモックする

2023/09/18に公開

対象読者

  • jestを使用して、DBへの操作をモックしたい初学者
  • 未来の自分

解決方法

  • 以下は、テスト全体で使用するので、グローバルに書く
// prisma clientのモック
const mockPrisma = {
    task: {
    // 使用するprismaのDB操作のメソッド
      findMany: jest.fn(),
      findFirst: jest.fn(),
    },
} as unknown as PrismaClient;
  • テストの後処理的な
afterEach(() => {
    jest.restoreAllMocks();
});
  • モックを使用するところ
test("正常系 - 空の結果が返ること", async () => {
    const mockRecords = [
        {
            id: 1,
            name: 'Task 1',
            desc: 'Description 1',
            status: 'Completed',
            createdAt: new Date('2023-09-05T10:00:00Z'),
            updatedAt: new Date('2023-09-05T11:00:00Z'),
        },
        // Add more mock records as needed
    ];
    
    const driverTaskService = new TaskDriverImpl(mockPrisma);
    const findmany = mockPrisma.task.findMany as jest.Mock<any>;
    findmany.mockResolvedValue(mockRecords);


    const expected = await driverTaskService.getAll();
    expect(mockRecords).toEqual(expected);
});
コード全体
import { afterEach, describe, expect, jest, test } from "bun:test";
import { DriverTask, TaskDriverImpl } from "../TaskDriver";
import { PrismaClient } from '@prisma/client';

const mockPrisma = {
    task: {
      findMany: jest.fn(),
      findFirst: jest.fn(),
    },
} as unknown as PrismaClient;

describe("タスク一覧を取得する", () => {
    afterEach(() => {
        jest.restoreAllMocks();
    });

    test("正常系 - 空の結果が返ること", async () => {
        const mockRecords = [
            {
              id: 1,
              name: 'Task 1',
              desc: 'Description 1',
              status: 'Completed',
              createdAt: new Date('2023-09-05T10:00:00Z'),
              updatedAt: new Date('2023-09-05T11:00:00Z'),
            },
            // Add more mock records as needed
        ];
      
        const driverTaskService = new TaskDriverImpl(mockPrisma);
        const findmany = mockPrisma.task.findMany as jest.Mock<any>;
        findmany.mockResolvedValue(mockRecords);


        const expected = await driverTaskService.getAll();
        expect(mockRecords).toEqual(expected);
    });
});

describe("タスクをIdで取得する", () => {
    test("任意の1つのタスクが返ること", async () => {
        const testDate = new Date(2023,8,18,13,56,8);
        const testResult = new DriverTask(1,"test","hoge",1,testDate,testDate);
        const driverTaskService = new TaskDriverImpl(mockPrisma);
        const findFirst = mockPrisma.task.findFirst as jest.Mock<any>;
        findFirst.mockResolvedValue(testResult);
        
        const expected = await driverTaskService.getById(1);
        expect(testResult).toEqual(expected);
    });
});

まとめ

  • prismaは、初めて使ったがわかりやすくて良い
  • モックは最初難しいが、できれば楽
  • あんまり記事なかったけど、DB操作周りっモックでテストしないのか

Discussion