javascript - 在 useEffect 中测试组件调用 API
问题描述
我想测试应该显示在我的功能组件中的 api 调用和返回的数据。我有一个组件,它在第一次加载时以及某些事情发生变化时(即键入时)调用 API。
我有一个useEffect
像这样调用 API:
useEffect(() => {
const query = queryString;
const apiRequest = async () => {
try {
setIsFetching(true);
const response = await getData(query, page);
setData(response.data);
} catch (error) {
// Do some error
console.log('error');
} finally {
setIsFetching(false);
}
};
apiRequest();
}, [queryString, page]);
getData
是axios
这样的函数:
let getDataRequest;
const getData = (searchQuery = null, page = PAGE, size = PAGE_SIZE) => {
if (getDataRequest) getDataRequest.cancel();
getDataRequest = axios.CancelToken.source();
return axios.get('url_to_api', {
params: {
page,
searchQuery,
size,
},
cancelToken: getDataRequest.token,
});
};
尝试测试此组件时,我遇到了错误When testing, code that causes React state updates should be wrapped into act(...):
我一直在尝试关注第一个链接、第二个链接、 第三个链接和更多页面,但仍然没有运气。
这是测试的一个版本,我仍然看到错误:
it('should render data', async () => {
let container;
act(async () => {
await getData.mockResolvedValueOnce({
data: { things: data, meta: { current_page: 1 } },
});
container = render(<Component />);
});
await waitFor(() => container.queryByText('Text I would expect after api call'));
})
我也尝试过在我的测试文件中模拟该函数,如下所示:
import { getData } from './dataAccess';
const mockedData = { data: { things: data } };
jest.mock('./api', () => ({
getData: jest
.fn()
.mockImplementation(() => new Promise(resolve => resolve(mockedData))),
}));
我正在使用import { act } from 'react-dom/test-utils';
酶和玩笑。我也在使用'@testing-library/react';
解决方案
推荐阅读
- swiftui - 从 UIKit 更新 @State var
- java - 飞碟:rowsapn 和 page-break-inside
- android - 我的 GestureDetector 中的“上下文”有问题吗?
- c - 带有 SNDRV_PCM_IOCTL_WRITEI_FRAMES 的 ALSA 断管
- excel - Excel VBA 代码引发运行时错误“13”:类型不匹配错误
- android - Android MVVM:无法实例化视图模型
- raspberry-pi - 使用 Raspberry PI 和公共 wifi 进行物联网发现的 UDP 广播
- python - sklearn ValueError:发现样本数量不一致的输入变量 [192, 48]
- java - 为什么我在解析 XML 时会从此方法中得到重复记录?
- dialogflow-es - 如何通过 Dialogflow 在手机上接收带有票号的短信?