Перейти к содержимому

17. Тестирование

Тестирование кода, работающего с базой данных, требует особого подхода. Prisma предоставляет несколько стратегий: мокирование клиента, использование тестовой базы данных и изоляция тестов через транзакции.

1. Unit-тесты с мок-клиентом — самый быстрый подход. Используется библиотека jest-mock-extended для создания полностью типизированного мок-объекта.

2. Integration-тесты с тестовой БД — используется отдельная база данных, которая очищается перед каждым тестом.

3. Изоляция через транзакции — каждый тест запускается в транзакции, которая откатывается в конце.

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>(),
})
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 () => {
const mockUser = { id: 1, email: '[email protected]', name: 'Иван' }
mockCtx.prisma.user.create.mockResolvedValue(mockUser)
const result = await createUser(ctx, '[email protected]', 'Иван')
expect(result).toEqual(mockUser)
expect(mockCtx.prisma.user.create).toHaveBeenCalledWith({
data: { email: '[email protected]', name: 'Иван' },
})
})
})
// Использовать отдельный DATABASE_URL для тестов
const prisma = new PrismaClient({
datasources: { db: { url: process.env.TEST_DATABASE_URL } },
})
afterEach(async () => {
// Очистить таблицы в правильном порядке
await prisma.post.deleteMany()
await prisma.user.deleteMany()
})