我有一个组件,其中没有几个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);
});
但是,我不确定此示例中的测试挂钩如何?
答案 0 :(得分:3)
您正在测试该组件的实现细节,这不是一个好主意(您基本上是将测试耦合到该实现,而不是使用测试来确定该组件已实现了预期的功能)。
相反,我会尝试找到一种方法来像测试用户一样测试组件并确定输出是否正确。
首先集成testing-library,然后遵循here和here所述的某些模式。
问题是,您要测试什么?该测试的预期结果是什么?它将涵盖哪些行为?
LE:在您的情况下,正如我所看到的,您正在尝试测试React-Resizable,您可以尝试在调整大小手柄上使用mouseDown
,然后发出mouseMove
和mouseUp
看看是否发生了正确的事情(我没有从代码中看到您对状态值所做的事情,您将它们用于什么状态)