使用 SVG 导入对样式组件进行单元测试

rah*_*all 4 javascript reactjs jestjs styled-components

我正在升级 React 项目的依赖项。我将 styled-components 从 升级1.4.42.5.0-1. 自从我读到 styled-components v2 是 v1 的直接替代品后,我并没有预料到会有任何重大变化。

我在网络应用程序中没有看到任何重大更改,但我的测试用例已损坏。

考虑以下愚蠢且无用的测试。

test('does something', () => {
  expect(true).toBe(true);
});
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,测试有效。但是,一旦我尝试在测试文件中导入样式组件,它就会失败。

我添加了以下导入。

import {Container} from './styled';
Run Code Online (Sandbox Code Playgroud)

容器样式组件的定义如下:

export const Container = styled.div`
  width: 80%;
  display: flex;
  flex-direction: column;
  transition: opacity 0.25s ease-in-out;
`;
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Cannot create styled-component for component: [object Object]
Run Code Online (Sandbox Code Playgroud)

现在,我无法理解发生了什么事。为什么我无法导入样式组件?

编辑

问题出在导入 svg 资源的样式组件上。请参阅下面的答案。

rah*_*all 5

一次注释掉一个样式组件后,我发现问题出在使用 svg 资源的样式组件上。考虑以下样式组件

import Edit from 'assets/edit-icon.svg';

export const EditIcon = styled(Edit)`
  transition: opacity 0.25s ease-in-out;
  position: absolute;
  opacity: 0;
  z-index: 2;

  &:hover {
    transform: scale(1.05);
  }

  &:active {
    transform: scale(0.93);
  }
`;
Run Code Online (Sandbox Code Playgroud)

现在,我们的单元测试无法将 SVG 资源作为 React 组件导入(通过 Webpack 处理)。因此,我们需要通知我们的单元测试忽略 SVG 资产。

为此,我们需要配置 jest。

"moduleNameMapper": {
      "\\.(svg)$": "<rootDir>/test/__mocks__/svgMock.js"
    }
Run Code Online (Sandbox Code Playgroud)

在 svgMock.js 中

module.exports = '';
Run Code Online (Sandbox Code Playgroud)

在我现有的设置中,我有

module.exports = {};
Run Code Online (Sandbox Code Playgroud)

虽然这适用于 styled-components-1.x,但它在 >=styled-components-2.x 时失败。

以下博客文章向我指出了一个答案:https ://diessi.ca/blog/how-to-exclude-css-images-anything-from-unit-tests/