javascript - 如何在 reactjs 中编写身份验证流程测试
问题描述
我正在尝试使用jest
和测试我的仪表板页面react-test-library
。但问题是,即使在我的测试用例中渲染组件后,我也无法访问 dom 元素,它在运行后登录时向我显示了注册页面 dom 元素yarn test
。
我不知道如何测试这个。当用户登录时,我的身份验证流程是这样的,我将 access_token 和刷新令牌保存到本地存储。
也有两条路线:
- 私人路线和
- 公共路线
我也收到此错误:
node:internal/process/promises:246 triggerUncaughtException(err, true /* fromPromise */); ^
[UnhandledPromiseRejection:此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。承诺被拒绝,原因是“TypeError: r.node.getBBox is not a function”。] { code: 'ERR_UNHANDLED_REJECTION' }
import React from "react";
import {
BrowserRouter as Router,
Switch,
Route,
Redirect,
RouteComponentProps,
} from "react-router-dom";
const isAuth = () => {
const token = localStorage.getItem("access_token");
const refreshToken = localStorage.getItem("refresh_token");
if (!token || !refreshToken) {
return false;
}
try {
const decodeToken: JwtPayload = decode(refreshToken);
const { exp } = decodeToken;
if ((exp as number) < new Date().getTime() / 1000) {
localStorage.removeItem("access_token");
localStorage.removeItem("refresh_token");
localStorage.removeItem("status");
localStorage.removeItem("logginSession");
return false;
}
} catch (error) {
return false;
}
return true;
};
export const PrivateRoute = ({ children, ...rest }: any) => {
return (
<SideBar>
<Route
{...rest}
render={({ location }: RouteComponentProps) =>
isAuth() ? (
children
) : (
<Redirect
to={{
pathname: "/login",
// state: { from: location }
}}
/>
)
}
/>
</SideBar>
);
};
const AuthCheckRoute = ({ children, ...rest }: any) => {
return (
<Route
{...rest}
render={({ location }: RouteComponentProps) =>
localStorage.getItem("status") === "user" ? (
<Redirect
to={{
pathname: "/dashboard",
// state: { from: location }
}}
/>
) : (
children
)
}
/>
);
};
const Routes: React.FC = () => {
return (
<Router>
<Switch>
<PrivateRoute exact path="/dashboard" children={<Dashboard />} />
<PrivateRoute exact path="/invoices" children={<CustomerInvoices />} />
<AuthCheckRoute exact path="/login" children={<Login />} />
<AuthCheckRoute path="/" children={<Login />} />
</Switch>
</Router>
);
};
export default Routes;
这就是我尝试测试的方式:
import React from "react";
import Dashboard from "../../../pages/Dashboard";
import { render } from "@testing-library/react";
import { ThemeProvider } from "@material-ui/styles";
import CustomTheme from "../../../assets/globalstyles/GlobalStyles";
import {
BrowserRouter,
BrowserRouter as Router,
Switch,
} from "react-router-dom";
test("render Dashboard page", () => {
const { getByText, debug } = render(
<ThemeProvider theme={CustomTheme}>
<BrowserRouter> <--- if i remove this line
<Switch> <---and this line then it shows signup dome element otherwise it shows above error.
<Dashboard />
</Switch>
</BrowserRouter>
</ThemeProvider>
);
expect(getByText("Dashboard")).toBeInTheDocument();
debug(); <-- this signup is showing me dom elements of signup page instead of Dashboard page.
});
解决方案
推荐阅读
- reactjs - 在倒数计时器中动态更新道具时遇到问题 - 使用反应钩子创建
- c# - PowerShell Types.ps1xml 导入模块时找不到类型
- sql - 在分层查询中用父数据覆盖空值
- logistic-regression - 任务数是否与 GridSearchCV 逻辑回归的拟合数相同?
- python - 我想在我的邮件正文中发送联系表的所有参数
- swift - 如何在应用程序聊天 xcode 中断开非活动用户的连接
- kubernetes - 如何从模板中的自定义 value.yaml 文件访问值(HELM)
- python - AttributeError:: 'module' 对象没有属性 'SparseCategoricalCrossentropy'
- google-sheets - 谷歌表格单元格数据的时区自动调整
- java - 无法转换 JSON 结果类型