【问题标题】:How mock an object created from a static method with a Mocked objet as param in Jest如何在 Jest 中使用 Mocked 对象作为参数来模拟从静态方法创建的对象
【发布时间】:2021-05-23 12:30:44
【问题描述】:

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

@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的逻辑时,

  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()

【问题讨论】:

    标签: jestjs nestjs


    【解决方案1】:

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

        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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多