NestJS 提供了一个专门的测试包,其中包含用于应用程序单元、集成和端到端测试的实用程序。本文档介绍了 NestJS 测试框架、其核心功能以及测试应用程序各种组件的最佳实践。
@nestjs/testing 包提供了一个专门的测试模块,可帮助为 NestJS 组件创建隔离的测试套件。它模拟了 NestJS 运行时环境,同时允许对模块组合和依赖注入进行精细控制。
来源: packages/testing/package.json1-37
NestJS 测试模块旨在与 Jest 和 Mocha 等流行的测试框架配合使用。它提供工具来创建模拟依赖注入容器的隔离测试模块。
来源: packages/testing/package.json1-37
NestJS 应用程序可以在不同粒度级别进行测试
单元测试侧重于隔离各个组件(服务、控制器、管道等)并独立于其依赖项进行测试。依赖项通常被模拟或存根。
集成测试验证多个组件如何协同工作,例如将服务与其数据库存储库一起测试,或测试多个交互式服务。
E2E 测试通过向应用程序端点发出 HTTP 请求并验证响应来验证整个应用程序的行为。
来源: package.json31-35 sample/06-mongoose/package.json14-19
大多数 NestJS 示例应用程序使用 Jest 作为测试框架。NestJS 项目中的典型 Jest 配置包括:
来源: sample/06-mongoose/package.json54-70 sample/14-mongoose-base/package.json53-69
TestingModule 是 NestJS 测试的核心类。它提供了创建应用程序模块的隔离实例以进行测试的能力。
在测试 NestJS 组件时,您通常使用 `Test.createTestingModule()` 方法创建测试模块。这允许您指定应包含在测试中的模块、控制器和提供者。
TestingModule 生成器提供了用于测试目的覆盖提供者、控制器和其他组件的方法。这允许您用模拟或测试替身替换真实实现。
来源: packages/testing/package.json20-36
在单元测试控制器时,通常通过提供模拟实现来隔离控制器与其服务依赖项。
服务单元测试侧重于隔离测试业务逻辑,其依赖项被模拟或存根。
这些组件可以单独测试,通过验证它们是否正确转换或验证输入,或者是否按预期控制请求流程。
来源: sample/06-mongoose/package.json14-19 sample/12-graphql-schema-first/package.json61-91
集成测试验证多个组件如何协同工作。在 NestJS 中,这通常涉及测试带有实际存储库或数据库连接的服务。
来源: package.json35
E2E 测试通过向应用程序端点发出 HTTP 请求并验证响应来验证整个应用程序的行为。
来源: sample/12-graphql-schema-first/package.json19
GraphQL 应用程序需要对解析器和模式定义进行专门的测试方法。
来源: sample/12-graphql-schema-first/package.json21-36 sample/23-graphql-code-first/package.json21-34
微服务测试涉及验证消息模式、事件处理和传输层集成。
来源: packages/microservices/package.json1-72
WebSocket 测试验证实时通信能力和事件处理。
来源: packages/websockets/package.json1-37 packages/platform-socket.io/package.json1-29 packages/platform-ws/package.json1-29
NestJS 应用程序通常包含用于运行不同类型测试的预定义 npm 脚本:
| 测试类型 | 命令 | 描述 |
|---|---|---|
| 单元测试 | npm test | 运行所有单元测试 |
| 监视模式 | npm run test:watch | 在开发中以监视模式运行测试 |
| 报道 | npm run test:cov | 运行带有覆盖率报告的测试 |
| 调试 | npm run test:debug | 运行带有调试器的测试 |
| 端到端测试 (E2E Tests) | npm run test:e2e | 运行端到端测试 |
来源: package.json31-35 sample/06-mongoose/package.json14-19
来源: packages/testing/package.json1-37
NestJS 测试框架提供了强大的工具,用于在不同粒度级别测试应用程序。通过利用 `@nestjs/testing` 包并遵循本文档中概述的测试实践,您可以构建可靠、经过充分测试的 NestJS 应用程序。
该框架的测试实用程序设计用于与 NestJS 依赖注入系统无缝协作,从而可以轻松地创建具有模拟依赖项的隔离测试模块。无论您是为单个组件编写单元测试、为多个交互式部分编写集成测试,还是为整个应用程序流程编写端到端测试,NestJS 都提供了您实现全面测试覆盖所需的工具。