【发布时间】:2020-12-28 17:06:02
【问题描述】:
我有一个很少有 useState 钩子的组件:
const [resizing, setResizing] = React.useState(false);
const [x, setX] = React.useState(0);
const [y, setY] = React.useState(0);
在某些地方我一次调用多个钩子,例如在onResize,我同时调用setResizing 和setX 或setY 钩子:
<ResizableBox
height={520}
width={370}
minConstraints={[370, 520]}
maxConstraints={[Infinity, Infinity]}
className={classes.resizable}
onResize={(e) => {
if (e.movementX !== 0) {
setResizing(true);
setX((prev) => prev + e.movementX);
} else if (e.movementY !== 0) {
setResizing(true);
setY((prev) => prev + e.movementY / 2);
}
}}
onResizeStop={() => {
setResizing(false);
}}
>
我习惯于测试易于测试状态变化的类组件。
我想用这样的东西来测试它:
const setXSpy = jest.spyOn(React, 'setX');
const setYSpy = jest.spyOn(React, 'setY');
const setResizeSpy = jest.spyOn(React, 'setResize');
it('calls useState hooks correctly', () => {
resizableBox.props.onResize({movementX: 1});
expect(setXSpy).toHaveBeenCalledWith(1);
expect(setYSpy).not.toHaveBeenCalled();
expect(setResizeSpy).toHaveBeenCalledWith(true);
});
但是,我不确定在这个例子中如何测试钩子?
【问题讨论】:
-
你使用什么反应测试库?
-
开个玩笑和 react-test-renderer
-
您可以使用 Enzyme 等库来执行此操作,但它的反模式,通常您希望根据新状态检查 UI 组件的状态。
-
这是我认为对您有帮助的解决方案:stackoverflow.com/a/70709100/11769900
标签: reactjs jestjs react-hooks