【问题标题】:How to mock a third party React component using Jest?如何使用 Jest 模拟第三方 React 组件?
【发布时间】:2020-09-23 19:08:12
【问题描述】:

TLDR; 模拟从第三方库导入的 React 组件的正确方法是什么?

我正在测试一个名为 <App/> 的组件。它使用名为 <Localize/> 的第三部分组件,该组件由名为 localize-toolkit 的库提供。

我在使用 Jest 模拟 <Localize/> 时遇到了一些问题。

这是我尝试模拟它的方法。

jest.mock('localize-toolkit', () => ({
  // Normally you pass in a key that represents the translated caption.
  // For the sake of testing, I just want to return the key.
  Localize: () => (key:string) => (<span>{key}</span>)
}));

我已经为&lt;App/&gt; 编写了一个单元测试,看起来像这样。

it('Test', () => {
    const component = render(<App/>);
    expect(component).toMatchSnapshot();
  }
)

它会通过,但是这是返回的警告消息。

Functions are not valid as a React child. This may happen if you return a Component instead of &lt;Component /&gt; from render.

当我查看快照时,我会看到一系列句点“...”,其中应该出现本地化标题。

我没有正确地模拟Localize 组件吗?

【问题讨论】:

    标签: reactjs jestjs


    【解决方案1】:

    这就是我最终的做法。

    注意第三方组件Localize 需要如何作为函数返回。

    jest.mock('localize-toolkit', () => ({
      Localize: ({t}) => (<>{t}</>)
    }));
    

    如果有多个组件,而您只想模拟其中一个,您可以这样做:

    jest.mock("localize-toolkit", () => {
        const lib = jest.requireActual("localize-toolkit");
    
        return {
            ...lib,
            Localize: ({t}) => (<>{t}</>), 
        };
    });
    

    【讨论】:

      【解决方案2】:

      我们可以模拟第 3 方库,例如我需要模拟 react-lazyload

      组件.tsx

      import LazyLoad from 'react-lazyload';
      
      render() {
        <LazyLoad><img/></LazyLoad>
      }
      

      在 jest.config.js 中

      module.exports = {
        moduleNameMapper: {
         'react-lazyload': '/jest/__mocks__/react-lazyload.js',
        }
      }
      

      开玩笑/嘲笑/react-lazyload.js

      import * as React from 'react';
      
      jest.genMockFromModule('react-lazyload');
      
      const LazyLoad = ({children}) => <>{children}</>;
      
      module.exports = { default: LazyLoad };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-17
        • 2019-12-14
        • 2018-02-19
        • 1970-01-01
        • 2020-07-16
        • 2017-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多