开玩笑地嘲笑高阶组件

IT技术 javascript reactjs jestjs
2021-05-02 00:28:14

我想确保正在开玩笑地调用 HOC 组件,但我似乎无法开始jest.mock工作。我的 HOC 是这样的:

const withEntity = (
  ...args
) => {
  const wrappedComponent = WrappedComponent => {
    const innerComponent = ({ ...props }) => {    
      return (
        <WrapperComponent
          {...props}
        >
          <WrappedComponent />
        </WrapperComponent>
      );
    };

    innerComponent.propTypes = {
      ...
    };

    return innerComponent;
  };

  wrappedComponent.propTypes = {
    ...
  };

  return wrappedComponent;
};

withEntity.propTypes = {
  ...
};

export default withEntity;

在一个单独的文件中,该withEntity函数的调用方式如下:

export const DoSomething = withEntity(...args)(MyComponent);

然后,在DoSomething组件的测试文件中,我尝试导入withEntity函数并像这样模拟它:

import withEntity from "../../../shared/entity/higher_order_components/withEntity";
jest.mock("../../../shared/entity/higher_order_components/withEntity");

但是当我实际尝试运行测试时,我收到此错误:

  ● Test suite failed to run

    TypeError: (0 , _withEntity.default)(...) is not a function

不知道如何解决这个错误,我在这里做错了什么?

2个回答

模拟你的 HOC 应该是这样的:

jest.mock('../your/HOC', () => () => 
    Component => props => <Component {...props} /> 
)

它可以读作:

jest.mock('../your/HOC', () => `

创建一个返回您的 HOC 函数的模拟,

() => 

返回您的 HOC 又名的函数withEntity(...args)

Component => props => <Component {...props} /> 

HOC 本身,它是一个函数,它获取组件并返回一个获取 props 的函数,并返回一个返回渲染组件及其 props 的函数。

就我而言,因为我使用的是typescript,所以这对我有用。

jest.mock('components/MyComponent', () => ({
  __esModule: true,
  default({children}: any) {
    return children(() => {});
  },
}));