如何模拟反应自定义钩子返回的值?

时间:2020-02-17 20:34:12

标签: reactjs jestjs react-hooks react-testing-library

这是我的自定义钩子:

  export function useClientRect() {
    const [scrollH, setScrollH] = useState(0);
    const [clientH, setClientH] = useState(0);
    const ref = useCallback(node => {
      if (node !== null) {
        setScrollH(node.scrollHeight);
        setClientH(node.clientHeight);
      }
    }, []);
    return [scrollH, clientH, ref];
  }
}

我希望每次调用它都返回我的值。喜欢:

jest.mock('useClientRect', () => [300, 200, () => {}]);

我该如何实现?

1 个答案:

答案 0 :(得分:13)

将挂钩作为模块加载。然后模拟该模块:

jest.mock('module_name', () => ({
    useClientRect: () => [300, 200, jest.fn()]
}));

模拟应在测试fn之外的文件顶部调用。因此,我们将只有一个数组作为模拟值。

如果要在不同的测试中模拟具有不同值的钩子:

import * as hooks from 'module_name';

it('a test', () => {
    jest.spyOn(hooks, 'useClientRect').mockImplementation(() => ([100, 200, jest.fn()]));
    //rest of the test
});