如何使用Jest测试NestJS Resolver的返回类型定义?
测试NestJS GraphQL Resolver的@Mutation返回类型
我是NestJS新手,正在做单元测试以保证代码覆盖率,大部分模块都已完成测试,但卡在了auth.resolver.ts的测试上——没法验证@Mutation(() => Boolean)这个返回类型定义。
Resolver代码如下:
import { Resolver, Mutation, Args, Context } from '@nestjs/graphql'; import { ResellerAuthService } from './reseller-auth.service'; import { Response } from 'express'; import { UnauthorizedException } from '@nestjs/common'; import { LoginResellerInput } from './input/login-reseller.input'; @Resolver() export class AuthResolver { constructor(private resellerAuthService: ResellerAuthService) {} @Mutation(() => Boolean) async loginReseller( @Args('loginResellerInput') loginResellerInput: LoginResellerInput, @Context() context: { res: Response }, ): Promise<boolean> { const authenticated = await this.resellerAuthService.login( loginResellerInput, context.res, ); if (!authenticated) { throw new UnauthorizedException(); } else return true; } }
我尝试了以下测试代码,但没成功:
it('should have a mutation returning Boolean', () => { const returnType = Reflect.getMetadata('design:returntype', resolver.constructor.prototype, 'loginReseller'); expect(returnType).toBe(Boolean); });
通过Reflect.getOwnMetadataKeys(resolver.loginReseller)只能拿到[ 'graphql:resolver_type', 'graphql:resolver_name' ],找不到返回类型相关的元数据。
解决方案
NestJS的GraphQL装饰器使用自有元数据体系,design:returntype是TypeScript生成的元数据,对应TS函数的返回类型(这里是Promise<boolean>),和你要验证的GraphQL Schema返回类型不是一回事。要获取GraphQL mutation的返回类型,有两种可靠方式:
方法1:使用官方元数据存储工具
导入@nestjs/graphql提供的getMetadataArgsStorage,直接查询已注册的mutation元数据:
import { getMetadataArgsStorage } from '@nestjs/graphql'; import { AuthResolver } from './auth.resolver'; describe('AuthResolver', () => { let resolver: AuthResolver; beforeEach(() => { resolver = new AuthResolver({} as any); // 模拟ResellerAuthService依赖 }); it('should define a mutation returning Boolean', () => { const mutationEntry = getMetadataArgsStorage().mutations.find( (entry) => entry.target === AuthResolver && entry.methodName === 'loginReseller' ); expect(mutationEntry.returnType()).toBe(Boolean); }); });
方法2:直接读取GraphQL元数据键
如果不想用官方工具,也可以直接通过Reflect读取graphql:mutation_metadata键:
it('should have a mutation returning Boolean via Reflect', () => { const mutationMetadata = Reflect.getMetadata( 'graphql:mutation_metadata', AuthResolver.prototype, 'loginReseller' ); expect(mutationMetadata.returnType()).toBe(Boolean); });
两种方法本质都是读取NestJS GraphQL装饰器存储的元数据,调用returnType()就能拿到你在@Mutation(() => Boolean)中定义的返回类型。
内容的提问来源于stack exchange,提问作者Enzo
相关产品推荐
相关产品推荐

