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

cqoc49vn  于 2023-01-25  发布在  React
关注(0)|答案(2)|浏览(187)

我有一个组件,它有几个useState钩子:

const [resizing, setResizing] = React.useState(false);
const [x, setX] = React.useState(0);
const [y, setY] = React.useState(0);

在某些地方,我一次调用多个钩子,例如在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);
    }}
  >

我习惯于在易于测试状态更改的地方测试类组件。
我想用这样的东西来测试它:

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);
});

但是,我不知道如何测试像这个例子中的钩子?

idfiyjo8

idfiyjo81#

您正在测试该组件的实现细节,这不是一个好主意(您基本上是将测试耦合到该实现,而不是使用测试来确定该组件是否执行了它应该执行的操作)。
相反,我会尝试找到一种方法来测试组件,就像用户测试组件一样,并确定输出是否正确。
首先对testing-library进行积分,然后按照herehere中描述的一些模式进行积分。
问题是,你想测试什么?这个测试的预期结果是什么?它将涵盖哪些行为?
LE:在您的例子中,我看到您正在尝试测试React-Resizable,您可以在resize句柄上尝试和mouseDown,然后发出mouseMovemouseUp,看看是否发生了正确的事情(我从代码中看不到您正在使用状态值做什么,您使用它们做什么)

0md85ypi

0md85ypi2#

我使用的代码如下:

const mockSetState = jest.fn();

jest.mock('react', () => ({
  ...jest.requireActual('react'),
  useState: () => ['', mockSetState],
}));

it('...', () => {
    expect(mockSetState).toHaveBeenNthCalledWith(1, first expected value);
    expect(mockSetState).toHaveBeenNthCalledWith(2, second expected value');
})

相关问题