测试与调试NestJS中的GraphQLAPI
立即解锁
发布时间: 2025-08-14 01:10:35 阅读量: 13 订阅数: 18 


NestJS可扩展应用开发实战
### 测试与调试 NestJS 中的 GraphQL API
#### 1. 单元测试 GraphQL 解析器
单元测试 GraphQL 解析器的目的是验证每个解析器是否按预期运行,且相互独立。在代码优先的方法中,模式基于 TypeScript 装饰器生成,因此测试对于确保模式准确反映解析器中的业务逻辑至关重要。
##### 1.1 测试环境设置
在编写测试之前,需要设置测试环境。假设你已经有一个用户管理系统,并且解析器准备好进行测试。如果没有,可以参考 GitHub 上的代码优先分支作为起点。
测试 GraphQL 解析器的初始设置包括为每个解析器创建测试文件。在 NestJS 中,这些文件通常与解析器文件放在一起,并使用 `.spec.ts` 后缀命名。例如,`UsersResolver` 的测试文件应为 `users.resolver.spec.ts`。
使用 Nest CLI 生成测试文件后,尝试执行该文件,确保一切正常运行。
##### 1.2 编写解析器的单元测试
NestJS 中单元测试的核心是 `@nestjs/testing` 模块,它提供了创建模拟应用程序运行时的测试环境的工具。以下是测试 `UsersResolver` 的基本测试套件结构:
```typescript
import { Test, TestingModule } from '@nestjs/testing';
import { UsersResolver } from './users.resolver';
import { UsersService } from './users.service';
describe('UsersResolver', () => {
let resolver: UsersResolver;
beforeEach(async () => {
const module: TestingModule = await Test
.createTestingModule({
providers: [UsersResolver, UsersService],
}).compile();
resolver = module.get<UsersResolver>(UsersResolver);
});
it('should be defined', () => {
expect(resolver).toBeDefined();
});
// 其他测试将放在这里
});
```
这个设置确保解析器及其所有依赖项都被正确实例化,并且可以进行测试。这是一个基础步骤,用于验证测试基础设施是否正确配置。
##### 1.3 模拟依赖项
由于解析器通常依赖于服务进行数据获取和操作,因此需要模拟这些依赖项以隔离测试。模拟允许我们在不连接实际数据库或调用外部 API 的情况下模拟这些服务的行为。
以下是如何为测试模拟 `UsersService`:
```typescript
providers: [
UsersResolver,
{
provide: UsersService,
useValue: {
findAll: jest.fn(() => [
// 模拟用户数据
]),
// 其他模拟函数
},
},
];
```
通过为 `UsersService` 提供模拟实现,我们可以控制返回值,并为解析器测试模拟各种场景。
##### 1.4 测试解析器逻辑
在完成测试设置和模拟后,我们可以编写测试来验证解析器的行为。例如,测试 `findAll` 解析器的测试用例如下:
```typescript
it('should return an array of users', async () => {
const users = await resolver.findAll();
expect(users).toBeInstanceOf(Array);
expect(users).toHaveLength(mockedUsers.length);
});
```
这个测试确保 `findAll` 解析器返回一个用户数组,并且用户数量与模拟用户的数量匹配。
以下是完整的解析器测试文件示例:
```typescript
// users.resolver.spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { UsersResolver } from './users.resolver';
import { UsersService } from './users.service';
import { CreateUserInput } from './dto/create-user.input';
describe('UsersResolver', () => {
let resolver: UsersResolver;
let mockUsersService: Partial<UsersService>;
beforeEach(async () => {
mockUsersService = {
create: jest.fn((dto: CreateUserInput) => ({
id: Date.now(), ...dto
})),
// 其他方法
};
const module: TestingModule = await Test
.createTestingModule({
providers: [
UsersResolver,
{
provide: UsersService,
useValue: mockUsersService,
},
],
}).compile();
resolver = module.get<UsersResolver>(UsersResolver);
});
it('should be defined', () => {
expect(resolver).toBeDefined();
});
it('should create a user', () => {
const dto: CreateUserInput = {
name: 'Test User',
email: '[email protected]',
};
expect(resolver.createUser(dto)).toEqual({
id: expect.any(Number),
...dto,
});
expect(mockUsersService.create)
.toHaveBeenCalledWith(dto);
});
});
```
#### 2. GraphQL 的端到端(E2E)测试
之前我们分别测试了代码块,但还没有测试 Nest 装饰器,如 `@Query` 或 `@Mutation`。接下来我们将进行这方面的测试。
##### 2.1 测试 `GetHello` 查询
默认情况下,Nest 会为我们安装 `supertest` 包,该包可以帮助我们模拟 HTTP 请求。所有的 GraphQL 请求(查询和变更)都是对应用程序入口点 `/graphql` 的 POST 请求。
首先,我们需要创建辅助文件来保存请求参数。在 `src/common/helpers/graphql.helper.ts` 中添加以下内容:
```typescript
export const GRAPHQL_ENDPOINT = '/graphql';
export const HELL0_WORLD = 'Hello World!';
export const GET_HELLO_OPERATION_NAME = 'Query';
export const GET_HELLO = `query Query {
getHello
}`;
```
然后更新 `app.e2e-spec.ts` 文件:
```typescript
// test/app.e2e-spec.ts
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as reques
```
0
0
复制全文
相关推荐










