测试由react-keycloak保护的页面

时间:2020-08-28 04:54:04

标签: reactjs keycloak

在我的React应用程序中,我使用的是来自“ react-keycloak / web”库中的keycloak和KeycloakProvider。

某些路由通过使用PrivateRoute组件进行保护,该组件使用useKeycloak()挂钩拉出密钥隐藏状态,并检查用户是否被授权并具有正确的角色:

const [keycloak, initialized] = useKeycloak();

我的问题与测试我的PrivateRoute组件有关。无论我尝试初始化什么,始终保持为false,从而阻止页面呈现。

以useKeycloak.test.js文件为灵感,我制作了一个MockAuthProvider组件来包装测试:

import React from "react";
import { KeycloakProvider } from "@react-keycloak/web";

export const createKeycloakStub = () => ({
  init: jest.fn().mockResolvedValue(true),
  updateToken: jest.fn(),
  login: jest.fn(),
  logout: jest.fn(),
  register: jest.fn(),
  accountManagement: jest.fn(),
  createLoginUrl: jest.fn(),
  ...
});

interface MockedAuthProviderProps {
  children: React.ReactChild;
  mocks: { [key: string]: typeof jest.fn };
}

export const MockedAuthProvider = (props: MockedAuthProviderProps) => {
  const { children, mocks } = props;
  const defaultMocks = createKeycloakStub();
  const keycloak = { ...defaultMocks, ...mocks };

  return (
    <KeycloakProvider keycloak={keycloak}>
      {children}
    </KeycloakProvider>
  );
};

然后我在测试中就这样使用它

<MockedAuthProvider mocks={keycloakMocks}>
  <MemoryRouter initialEntries={["/secret"]}>
    <PrivateRoute roles={roles} path="/secret">
      <div>Protected Content</div>
    </PrivateRoute>
  </MemoryRouter>
</MockedAuthProvider>

有人找到一种与useKeycloak一起成功测试组件或初始化为true的方法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我设法通过模拟钩子本身来解决它。它不像我想要的那样干净,但目前效果很好。

let mockInitialized = false;

jest.mock("@react-keycloak/web", () => {
  const originalModule = jest.requireActual("@react-keycloak/web");
  return {
    ...originalModule,
    useKeycloak: () =>  [
      mockKeycloakStub,
      mockInitialized
    ]
  };
})

然后,我可以在每个测试中设置mockInitialized的值,具体取决于我希望的初始化状态是什么。