【发布时间】:2020-10-22 13:52:23
【问题描述】:
我有以下组件,其中包含一个用 typescript 编写的嵌套异步调用的反应钩子。
const sampleComponent: FunctionComponent = (): ReactElement => {
const [ detail, setDetail ] = useState<detailObject>(undefined);
useEffect(() => {
getConfigs();
}, [ detail != undefined ]);
const getConfigs = () => {
getConfig().then((configResp: any) => {
if(response.status === 200) {
getConfigDetail(configResp.data.id).then((response) => {
if(response.status === 200) {
setDetail(response.data)
}
})
}
})
}
return (
//Some UI related to the responses.
)
}
我用以下测试对此进行了测试。
const configList = jest.spyOn(api, "getConfigList");
const configDetail = jest.spyOn(api, "getConfig");
configList.mockImplementation(() => {
return Promise.resolve(configListRequestResponse); // these are sample responses
});
configDetail.mockImplementation(() => {
return Promise.resolve(configDetailsRequestResponse); // these are sample responses
})
test("Test proper rendering config component", async () => {
await act(async () => {
render(
<Provider store={ store }>
<sampleComponent/>
</Provider>
);
await waitFor(() => expect(configList).toHaveBeenCalledTimes(1));
await waitFor(() => expect(configDetail).toHaveBeenCalledTimes(1));
expect(screen.getByTestId("remote-configs")).toBeInTheDocument();
});
});
当我运行此测试时,我收到以下错误。
警告:无法对未安装的组件执行 React 状态更新。这是一个空操作,但它表明您的应用程序中存在内存泄漏。要解决此问题,请在 useEffect 清理函数中取消所有订阅和异步任务。
> 95 | setDetail(response.data);
| ^
我在这里做错了什么?
【问题讨论】:
标签: reactjs jestjs react-testing-library