使用Jest测试时,使用webpack导入图像时,酶渲染失败

时间:2017-05-19 10:22:22

标签: javascript reactjs webpack jestjs enzyme

我想测试一个简单的组件是否呈现(因为我还在计算Jest)。应用程序本身使用webpack加载图像以显示徽标。

当我尝试挂载/渲染/浅化无状态组件时,Jest会抛出错误。

 FAIL  src/components/blog/blogList.spec.jsx
  ● Test suite failed to run

    /home/requinard/Projects/manus-frontend/src/img/manus_logo.png: Unexpected character '�' (1:0)
      > 1 | �PNG
          | ^
        2 | 
        3 | 
        4 | IHDR��G}    pHYs.#.#x�?vtEXtSoftwareAdobe ImageReadyq�e<K�IDATx��]  \�����=)DY

似乎它正在尝试加载图像而失败了。如何阻止Jest加载任何组件的图像,或者让它加载图像以使其仍然呈现。

无状态组件:

import React from 'react';
PropTypes from 'prop-types';
import { BlogPostHeader } from './blogPostHeader';
import './blog.scss';

export const BlogList = props => (
  <div className="blog-list">
    {props.posts.map((post, key) => <BlogPostHeader post={post} key={key} className="blog-list-item" />)}
  </div>
);

BlogList.propTypes = {
  posts: PropTypes.array,
};

无状态组件的测试

import React from 'react';
import { render } from 'enzyme';
import { BlogList } from './BlogList';


describe('<BlogList >', () => {
  it('should render in enzyme', () => {
    const wrapper = render(<BlogList />);
    expect(wrapper).toBeTruthy();
  });
});

渲染图像的组件(简化):

import logo from '../img/logo.png';'
  <div className="logo-container"><img src={logo} className="logo-child" /> </div>

4 个答案:

答案 0 :(得分:8)

对于模拟图像和其他静态资源,它们实际上在wiki中有一个项目。

https://facebook.github.io/jest/docs/webpack.html

我没有注意到<rootDir>被Jest本身取代,你必须自己包含它。

所以文件结构为

config \
  jest \
    fileMock.js
    styleMock.js
src |
package.json

我必须在package.json

中加入以下几行
"moduleNameMapper": {
      "\\.(css|scss|less)$": "<rootDir>/config/jest/styleMock.js",
      "\\.(png|jpg|gif|ttf|eot|svg)$": "<rootDir>/config/jest/fileMock.js"
    }

答案 1 :(得分:2)

在@Samyn提到的内容中添加更多详细信息。  您需要在package.json

中添加此条目

  "jest": {
    "modulePaths": [
      "__mocks__"
    ],
    "moduleNameMapper":  {
      "\\.(css|sass|scss)$": "styleMock.js",
      "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "fileMock.js"
    },
    "testPathIgnorePatterns": [
      "/node_modules/",
      "/build/"
    ]
  }

您需要在配置中提到的模拟文件夹,与此package.json位于同一文件夹。 在其中创建styleMock.js和fileMock.js文件。

/* styleMock.js contents */
module.exports = {}

/* fileMock.js contents */
module.exports = 'test-file-stub';

答案 2 :(得分:0)

如果图像是必需的,你可以模仿它,如:

import mockery from "mockery";

mockery.enable();
mockery.registerMock('../img/logo.png', 0)

在此处查找更多信息https://www.npmjs.com/package/mockery

答案 3 :(得分:0)

如果您正在使用package.json中的create-react-app并更改了脚本部分以包含酶(这是开始出现相同错误的方式,我已经回答了这个问题),则无需这样做, create-react-app已包含笑话和酵素,请参见https://github.com/facebook/create-react-app/issues/2564

相关问题