我编写了一个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-extended和jest,如何模拟GqlExecutionContext.create(context).getContext()
发布于 2021-05-23 04:30:44
我自己解决的。创建一个模拟函数并将其分配给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;https://stackoverflow.com/questions/67651380
复制相似问题