导入
测试认证服务
学习如何在 NestJS 应用程序中设置测试。
1import { AuthService } from 'src/auth/auth.service'; 2 3describe('AuthService', () => { 4 let service: AuthService; 5 6 it('should be defined', () => { 7 expect(service).toBeDefined(); 8 }); 9});
1import { Test, TestingModule } from '@nestjs/testing'; 2import { AuthService } from 'src/auth/auth.service'; 3 4describe('AuthService', () => { 5 let service: AuthService; 6 7 beforeEach(async () => { 8 const module: TestingModule = await Test.createTestingModule({ 9 providers: [AuthService], 10 }).compile(); 11 12 service = module.get<AuthService>(AuthService); 13 }); 14 15 it('should be defined', () => { 16 expect(service).toBeDefined(); 17 }); 18});
1Nest 无法解析 AuthService 的依赖项 (?, JwtService)。 2请确保索引为 [0] 的参数 UserRepository 在 RootTestModule 上下文中可用。
1// ** ... */ 2 3@Injectable() 4export class AuthService { 5 constructor( 6 @InjectRepository(User) private userRepository: Repository<User>, 7 private jwtService: JwtService, 8 ) {} 9 10 // ** ... */ 11}
1{ provide: JwtService, useValue: mockJwtService }, 2{ provide: getRepositoryToken(User), useValue: mockRepository }
1// auth.service.spec.ts 2// 其他导入 3 4let mockJwtService = { 5 signAsync: jest.fn(), 6}; 7let mockRepository = { 8 create: jest.fn(), 9 save: jest.fn(), 10 findOneBy: jest.fn(), 11}; 12 13describe('AuthService', () => { 14 // ...... 15});
使用 jest.fn() 具有多个优势:
-
可定制的行为:我们可以根据不同的测试场景自定义这些模拟方法的行为。例如,可以配置
findOneBy返回 null,以测试服务如何处理用户不存在的情况;也可以模拟错误,用于测试异常处理逻辑。 -
交互追踪能力:
jest.fn()可以记录对方法的调用情况,我们能验证它们是否被调用、调用了多少次以及传入了哪些参数。
以下是 MockRepository 和 MockJwtService 类型的说明:
-
MockRepository<T = any>:type MockRepository<T = any> = Partial<Record<keyof Repository<T>, jest.Mock>>;该类型为
Repository<T>中的每个方法(如create、save等)创建一个对应的模拟版本(jest.Mock)。具体解释如下:keyof Repository<T>:获取Repository<T>类型的所有方法名(如create、save等)。Record<keyof Repository<T>, jest.Mock>:创建一个对象结构,其中每个键是Repository<T>的方法名,值为jest.Mock类型。Partial<...>:使所有属性变为可选,便于只模拟部分方法。
-
MockJwtService:type MockJwtService = Partial<Record<keyof JwtService, jest.Mock>>;此类型与前者类似,但专用于
JwtService,为其中的每个方法(如signAsync、decode等)生成对应的jest.Mock模拟。
在测试环境中使用 TypeScript 类型进行模拟,可以获得类型提示和自动补全功能,有助于更高效地编写测试代码,并保障类型安全。
以下截图展示了针对 jwtService 和 userRepository 的 TypeScript 自动补全功能。