React 钩子 - 如何测试多个 useState 钩子

Lef*_*eff 7 reactjs jestjs react-hooks

我有一个几乎没有 useState 钩子的组件:

const [resizing, setResizing] = React.useState(false);
const [x, setX] = React.useState(0);
const [y, setY] = React.useState(0);
Run Code Online (Sandbox Code Playgroud)

在某些地方,我一次调用多个钩子,例如在这里onResize,我同时调用setResizingsetXsetY钩子:

<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);
    }}
  >
Run Code Online (Sandbox Code Playgroud)

我习惯于测试可以轻松测试状态更改的类组件。

我想用这样的东西来测试它:

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);
});
Run Code Online (Sandbox Code Playgroud)

但是,我不确定在这个例子中如何测试这样的钩子?

tud*_*ely 3

您正在测试该组件的实现细节,这不是一个好主意(您基本上是将测试耦合到该实现,而不是使用测试来确定组件是否执行其应该执行的操作)。

相反,我会尝试找到一种方法来像用户一样测试组件并确定输出是否正确。

首先集成测试库,然后遵循此处此处描述的一些模式。

问题是,你想测试什么?该测试的预期结果是什么?它将涵盖哪些行为?

LE:在你的情况下,正如我看到你正在尝试测试React-可调整大小,你可以尝试mouseDown在调整大小句柄上,然后发出mouseMovemouseUp看看是否发生了正确的事情(我从代码中看不到你是什么)处理状态值,你用它们做什么)