首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟从静态方法创建的对象,并在Jest中将模拟的对象作为param

如何模拟从静态方法创建的对象,并在Jest中将模拟的对象作为param
EN

Stack Overflow用户
提问于 2021-05-22 15:42:20
回答 1查看 347关注 0票数 1

我编写了一个Nestjs示例项目,项目源代码:https://github.com/hantsy/nestjs-graphql-sample,并尝试测试一个自定义权限保护。

代码语言:javascript
复制
@Injectable()
export class HasPermissionsGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const routePermissions = this.reflector.get<PermissionType[]>(
      HAS_PERMISSIONS_KEY,
      context.getHandler(),
    );
    if (!routePermissions || routePermissions.length == 0) {
      return true;
    }
    const { user } = GqlExecutionContext.create(context).getContext()
      .req as AuthenticatedRequest;
    return (
      user.permissions &&
      user.permissions.some((r) => routePermissions.includes(r))
    );
  }
}

当我试图使用Jest测试HasPermissionsGuard的逻辑时,

代码语言:javascript
复制
  it('should return true if the `HasPermissions` decorator is set', async () => {
    const context = mock<ExecutionContext>();
    context.getHandler.mockReturnValue({} as any);

    // the following will failed. 
    const host = mock<ExecutionContextHost>();
    host.getArgByIndex.mockImplementation((idx: number) => {
      return {
        req: { user: { permissions: [PermissionType.WRITE_POSTS] } as any },
      } as any;
    });

    const ctx = mock<GqlExecutionContext>();
    ctx.getContext.mockReturnValue({
      req: { user: { permissions: [PermissionType.WRITE_POSTS] } as any },
    });

    reflecter.get
      .mockReturnValue([PermissionType.WRITE_POSTS])
      .calledWith(HAS_PERMISSIONS_KEY, context.getHandler());

    const result = await guard.canActivate(context);

    expect(result).toBeTruthy();
    expect(reflecter.get).toBeCalledTimes(1);
  });

我使用了jest-mock-extendedjest,如何模拟GqlExecutionContext.create(context).getContext()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-23 04:30:44

我自己解决的。创建一个模拟函数并将其分配给create静态方法。

代码语言:javascript
复制
    const mockedCreate = jest
      .fn()
      .mockImplementation((ctx: ExecutionContext) => {
        return {
          getContext: jest.fn().mockReturnValue({
            req: {
              user: { permissions: [PermissionType.WRITE_POSTS] } as any,
            } as any,
          }),
        } as any;
      });
    GqlExecutionContext.create = mockedCreate;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67651380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档