Logo
Section 1 / 9

测试认证服务

学习如何在 NestJS 应用程序中设置测试。

导入

测试认证服务

学习如何在 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 自动补全功能。

授权

AuthService 中 signUp 方法的单元测试