javascript - 在 useEffect 反应钩子中使用路由时,RTL 中的 waitForElementToBeRemoved 错误超时
问题描述
我尝试了不同的解决方案来解决它,但没有一个有效。我正在使用React 测试库来测试登录组件。我有不同的路线堆叠如下:
<BrowserRouter>
<div>
<Home />
<Switch>
<Route path="/" exact component={Home} />
<Route path="/user" exact component={User} />
<Route path="/login" component={Login} />
<Route component={NotFound} />
</Switch>
</div>
</BrowserRouter>
这是我的登录组件。
export const Login = () => {
const history = useHistory();
useEffect(() => {
console.log("In useEffect");
history.push("/user");
}, []);
return <div data-testid="user-login">In progress</div>;
};
我写了这样的测试用例:
it("redirects to /user", async () => {
testRender(<Login />);
await waitForElementToBeRemoved(() =>
screen.findByTestId("user-login")
);
screen.debug();
});
这是我的 testRender 代码:
import React from "react";
import { render } from "@testing-library/react";
import { MemoryRouter } from "react-router-dom";
export function testRender(tsx) {
window.history.pushState({}, "Test page", "/");
return render(tsx, { wrapper: MemoryRouter });
}
当我运行测试用例时:
expect(getByTestId("user-login").textContent).toBe(
"In progress"
);
它正在通过,但“waitForElementToBeRemoved”案例不起作用(错误-“waitForElementToBeRemoved 超时”)。该组件确实执行了 useEffect 但history.push("/user"); 似乎不起作用。请让我知道是否有更好的方法来测试这种情况。
解决方案
推荐阅读
- docker - 如何在 Container-Optimized OS 中设置容器 ulimit
- sugarcrm - SuiteCRM/Sugar CRM 6.5:从不在生产环境中重新部署包?
- php - PHP - 修改字符串文本上图像的绝对路径/URL
- css - 如何在 Stack Overflow 网站上减少内容区域的 padding-top
- javascript - Mobx 商店中的 Toast 通知?不好的做法?
- node.js - 我应该如何存储/显示我的日期/时间字段?
- python - 如何使用多张工作表和不同的工作表名称将 dfs 导出为 excel
- javascript - ExtJS/JS:DataView 在 IE 中自动向上滚动?
- vba - 逐行合并单元格而不丢失任何数据
- microsoft-edge - Edge:如何使用刷新按钮进行自动对焦