首页 > 解决方案 > 如何使用 Jest 在nest.js 应用程序上测试标头请求

问题描述

我正在尝试用 jest 测试一个嵌套应用程序。我有一个调用服务的警卫,在该服务上我必须检查是否存在确定的标头,但我找不到任何有关如何完成此操作的文档。基本上我正在尝试从nest.js 测试canActivate 方法

这是我来自nest.js 的身份验证守卫

export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService) { }

  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return this.authService.isValidRequest(request);
  }
}

我想用玩笑测试下面的方法,不知道我是否需要模拟一个请求。如果标头已声明,则该方法将返回 true,否则返回 false。

我不知道如何在单元测试中测试标题。

export class AuthService {
  constructor() { }

  async isValidRequest(req: Request): Promise<boolean> {
 
    const userId = req.headers['user-id'];


    if (userId != 'undefined') {
     
       // I'm going to call another service here
       return true;
      
    }

    return false;
  }

标签: node.jsunit-testingjestjsnestjs

解决方案


老实说,我建议对AuthGuardService过度测试进行单元测试AuthGuard,只是因为ExecutionContext它有点像一个对象。对于一个超级简单的用例,你可以做

describe('AuthGuardService', () => {
  let service: AuthGuardService;
  beforeEach(async () => {
    const modRef = await Test.createTestingModule({
      providers: [
        AuthGuardService,
        { provide: AuthService, useValue: authServiceMock}
      ],
    }).compile();
    service = modRef.get(AuthGuardService);
  });

  describe('isValidRequest', () => {
    it('should return true', async () => {
      expect(
        await service.isValidRequest({
          headers: {'user-id': 'some value that is right'}
        } as any
      )).toBe(true);
    });
    it('should return false', async () => {
      expect(
        await service.isValidRequest({
          headers: {'user-id': 'some value that is wrong'}
        } as any
      )).toBe(false);
    });
  });
});

as any是为了防止打字稿抱怨。你在这里关心的只是有一个headers财产


推荐阅读