You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:23:09