reactjs - 如何触发事件 React 测试库
问题描述
我有一些代码,用于检测浏览器是否在线/离线:
export function useConnectivity() {
const [isOnline, setNetwork] = useState(window.navigator.onLine);
const updateNetwork = () => {
setNetwork(window.navigator.onLine);
};
useEffect(() => {
window.addEventListener('offline', updateNetwork);
window.addEventListener('online', updateNetwork);
return () => {
window.removeEventListener('offline', updateNetwork);
window.removeEventListener('online', updateNetwork);
};
});
return isOnline;
}
我有这个基本测试:
test('hook should detect offline state', () => {
let internetState = jest.spyOn(window.navigator, 'onLine', 'get');
internetState.mockReturnValue(false);
const { result } = renderHook(() => useConnectivity());
expect(result.current.valueOf()).toBe(false);
});
但是,我想运行测试以查看它是否在offline
触发事件时返回正确的值,而不仅仅是在渲染返回值的模拟之后。解决这个问题的最佳方法是什么?到目前为止,我得到的是:
test('hook should detect offline state then online state', async () => {
const { result, waitForNextUpdate } = renderHook(() => useConnectivity());
act(() => {
const goOffline = new window.Event('offline');
window.dispatchEvent(goOffline);
});
await waitForNextUpdate();
expect(result.current).toBe(false);
});
解决方案
我不确定“最好”,但这是一种方法:在测试中途更改模拟响应,并调整一些异步代码:
test('hook should detect online state then offline state', async () => {
const onLineSpy = jest.spyOn(window.navigator, 'onLine', 'get');
// Pretend we're initially online:
onLineSpy.mockReturnValue(true);
const { result, waitForNextUpdate } = renderHook(() => useConnectivity());
await act(async () => {
const goOffline = new window.Event('offline');
// Pretend we're offline:
onLineSpy.mockReturnValue(false);
window.dispatchEvent(goOffline);
await waitForNextUpdate();
});
expect(result.current).toBe(false);
});
推荐阅读
- scala - 是否可以从通用 scala 代码调用 scala 宏?
- c - printf("%c",*(*(ptr+i)+x)) 和 printf("%s",*(*(ptr+i)+x)) 的区别
- r - R - 创建光栅 - 正确的尺寸?
- katalon-studio - 有没有办法清理 Katalon 工作区
- python - 空白 Pygame 屏幕
- python-3.x - 如何修复“OperationError:没有这样的表”
- python - 如何在 Python 中修复我的数据类的 TypeError?
- javascript - 如何在组件vue js的数据中引用来自同一组件的方法
- ios - 如何覆盖子类的 swift 协议函数(例如来自 UIView 的 UILabel)
- ios - imageView.layoutMargins = UIEdgeInsets.zero 在 UICollectionViewCell 中没有效果