我是 NestJS 的新手,正在尝试对我的文件进行单元测试,以获得良好的代码覆盖率起点。
我成功测试了应用程序中的所有内容,除了 auth.resolver.ts
这里是:
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;
}
}
而且我无法测试返回类型:
@Mutation(() => Boolean)
我尝试使用:
it('should have a mutation returning Boolean', () => {
const returnType = Reflect.getMetadata('design:returntype', resolver.constructor.prototype, 'loginReseller');
expect(returnType).toBe(Boolean);
});
但我知道登录时只有
[ 'graphql:resolver_type', 'graphql:resolver_name' ]
Reflect.getOwnMetadataKeys(resolver.loginReseller)
当我认为 100% 行覆盖率是一个值得努力的指标时,我发现我可以通过将方法提取到它们自己的变量来测试这些方法,这些变量可以在装饰器和测试中直接调用。类似的东西
export const ReturnsString = () => String;
有了这个,我现在可以做
@Field(ReturnsString)
并在测试中做类似 expect(ReturnsString()).toEqual(String)
的事情。
显然,这是一个非常荒谬的测试,它只是为了获得代码覆盖率,并没有真正测试任何东西。这种覆盖范围应该通过服务器的集成测试、模式的合同测试或服务器周围的一般开发工作来获得,因为如果它在开发中不起作用,那么它在产品中也不起作用。