# 测试指南 - 后端测试策略
使用 Jest 进行后端服务测试的完整指南及最佳实践。
## 目录
- [单元测试](#unit-testing)
- [集成测试](#integration-testing)
- [模拟策略](#mocking-strategies)
- [测试数据管理](#test-data-management)
- [测试认证路由](#testing-authenticated-routes)
- [覆盖率目标](#coverage-targets)
---
## 单元测试
### 测试结构
typescript
// services/userService.test.ts
import { UserService } from './userService';
import { UserRepository } from '../repositories/UserRepository';
jest.mock('../repositories/UserRepository');
describe('UserService', () => {
let service: UserService;
let mockRepository: jest.Mocked;
beforeEach(() => {
mockRepository = {
findByEmail: jest.fn(),
create: jest.fn(),
} as any;
service = new UserService();
(service as any).userRepository = mockRepository;
});
afterEach(() => {
jest.clearAllMocks();
});
describe('create', () => {
it('如果电子邮件已存在,应抛出错误', async () => {
mockRepository.findByEmail.mockResolvedValue({ id: '123' } as any);
await expect(
service.create({ email: '
[email protected]' })
).rejects.toThrow('Email already in use');
});
it('如果电子邮件唯一,应创建用户', async () => {
mockRepository.findByEmail.mockResolvedValue(null);
mockRepository.create.mockResolvedValue({ id: '123' } as any);
const user = await service.create({
email: '
[email protected]',
firstName: 'John',
lastName: 'Doe',
});
expect(user).toBeDefined();
expect(mockRepository.create).toHaveBeenCalledWith(
expect.objectContaining({
email: '
[email protected]'
})
);
});
});
});
---
## 集成测试
### 使用真实数据库进行测试
typescript
import { PrismaService } from '@project-lifecycle-portal/database';
describe('UserService 集成', () => {
let testUser: any;
beforeAll(async () => {
// 创建测试数据
testUser = await PrismaService.main.user.create({
data: {
email: '
[email protected]',
profile: { create: { firstName: 'Test', lastName: 'User' } },