17. Тестирование
Тестирование кода, работающего с базой данных, требует особого подхода. Prisma предоставляет несколько стратегий: мокирование клиента, использование тестовой базы данных и изоляция тестов через транзакции.
Стратегии тестирования
Заголовок раздела «Стратегии тестирования»1. Unit-тесты с мок-клиентом — самый быстрый подход. Используется библиотека jest-mock-extended для создания полностью типизированного мок-объекта.
2. Integration-тесты с тестовой БД — используется отдельная база данных, которая очищается перед каждым тестом.
3. Изоляция через транзакции — каждый тест запускается в транзакции, которая откатывается в конце.
Мок Prisma Client с jest-mock-extended
Заголовок раздела «Мок Prisma Client с jest-mock-extended»import { PrismaClient } from '@prisma/client'import { mockDeep, DeepMockProxy } from 'jest-mock-extended'
export type Context = { prisma: PrismaClient}
export type MockContext = { prisma: DeepMockProxy<PrismaClient>}
export const createMockContext = (): MockContext => ({ prisma: mockDeep<PrismaClient>(),})Пример unit-теста
Заголовок раздела «Пример unit-теста»import { createMockContext, MockContext, Context } from './context'
describe('UserService', () => { let mockCtx: MockContext let ctx: Context
beforeEach(() => { mockCtx = createMockContext() ctx = mockCtx as unknown as Context })
it('должен создать пользователя', async () => { mockCtx.prisma.user.create.mockResolvedValue(mockUser)
expect(result).toEqual(mockUser) expect(mockCtx.prisma.user.create).toHaveBeenCalledWith({ }) })})Integration-тесты
Заголовок раздела «Integration-тесты»// Использовать отдельный DATABASE_URL для тестовconst prisma = new PrismaClient({ datasources: { db: { url: process.env.TEST_DATABASE_URL } },})
afterEach(async () => { // Очистить таблицы в правильном порядке await prisma.post.deleteMany() await prisma.user.deleteMany()})