javascript - 如何在我的 React Native 代码上测试更改 UI 的异步操作
问题描述
jest
我正在使用@testing-library/react-native
代码:
一个按钮点击调度一个功能:
onPress(_, dispatch) {
dispatch(getUserAddresses());
},
这个函数是异步的并且是一个thunk
中间件:
export const getUserAddresses = () => async (dispatch) => {
const res = await retrieveUserAddresses();
if (res.status === 'success') {
dispatch(setLocation(res.data));
}
};
它触发一个 axios 动作:
export const retrieveUserAddresses = async () => {
const token = await getToken();
try {
const res = await instance({
method: 'GET',
url: '/addresses',
headers: { Authorization: `Bearer ${token}` },
});
return res.data;
} catch (error) {
return error.response;
}
};
如果响应正常,这将触发此功能:
export const setLocation = (data) => ({
type: constants.SET_LOCATION,
data,
});
这最终会将我的减速器上的状态从更改false
为true
这将使组件安装或卸载。
在测试方面,当我运行此代码时:
// ...
it('...', () => {
// ...
const { getAllByTestId, getByTestId } = render(
<MockedNavigator component={User} name={USER_ROUTE} />,
);
// this fire event should click the button that dispatches getUserAddresses();
fireEvent.press(getAllByTestId('User-option')[1]);
// ...
});
因为getUserAddresses()
当我检查我的组件道具是否为“真”时,该函数是异步的,所以它说它是假的。但是,例如,如果我从这个函数中删除异步内容,它说这是真的,因为我确实单击了调度 getUserAddresses() 函数的按钮。
我已经尝试过使用 MSW,但它在我的原生反应中无法正常工作。(虽然它适用于reactjs)
我该如何测试它?
解决方案
我想到了两种方法来处理它。第一个等待您从第一条评论中获得示例的地方
await waitFor(() => expect(mockAPI).toHaveBeenCalledTimes(1))
第二个findBy
await screen.findByText('[SOME-TEXT-FROM-USER-COMPONENT]')
或其他一些与之相关的查询是 findBy。
我认为 findBy 应该可以工作,因为您想从 User 组件中查看某些内容,因此您只需从那里搜索某些内容。
编辑:
确保你没有意外地嘲笑任何东西。发生在我和其他人身上的测试很好,但由于模拟它失败了
推荐阅读
- javascript - 如何在 React 中使用多个材质的 ui 对话框?
- android - 将警报对话框按钮与样式居中对齐
- php - PHP 和 Twig 数组迭代
- python - python使用多处理将两个参数传递给一个函数,同时拆分一个参数并保持另一个完整
- mysql - 子查询行计数表格两个表连接
- rust - Rust 中具有条件编译的同一函数的不同版本
- php - Phpspreadsheet 如何为合并的单元格设置自动高度?
- r - ggforest() 不断给出“`[.data.frame`(data, , var) 中的错误:选择了未定义的列”
- mysql - MySQL选择变量不总是工作
- react-native - 如何在颤动中扩展小部件的属性并在自定义小部件中使用