如何在 React 和 Jest 的循环中获取组件 运行 的单元测试覆盖率

How to get unit test coverage of components run inside loop in React and Jest

我为吐出原子化组件图标的组件编写了一个单元测试(来自 icomoon.io 构建的自定义库)我遇到的问题是尽管每个组件都正确渲染;呈现每个图标的组件的测试在检查时显示没有覆盖。期望的结果是,当我 'npm run test:coverage' 它显示每个原子化图标组件的覆盖率,如果它在测试中正确呈现的话。

目录

* constants
--* iconConstants.js
* components
--* iconGenerator
-----* iconGenerator.js
-----* icons
--------* icon1.js
--------* icon2.js
--------* icon3.js
* __tests__
--* iconGenerator
-----*iconGenerator.test.js

这是生成器:

import React from 'react';
import PropTypes from 'prop-types';
import cx from 'classnames';

// Constants
import { ICONS } from '../../constants/iconConstants';

const iconGenerator = (props) => {
    const { type, size } = props;
    const inf = ICONS[type];

    return (
        <span
            className={ cx('ne8-icon', inf.iconCls) }
            style={ { fontSize: `${size}em` } }
            title={ inf.description } />
    );
};

iconGenerator.defaultProps = {
    size: 3,
};

iconGenerator.propTypes = {
    type: PropTypes.string.isRequired,
    size: PropTypes.number,
};

export default iconGenerator;

这是测试:

import React from 'react';
import ReactDOM from 'react-dom';
import iconGenerator from '../../components/iconGenerator/iconGenerator.js';

import { ICONS } from '../../constants/iconConstants';

describe('iconGenerator', () => {
    const iconKeys = Object.keys(ICONS);

    for (let i = 0; i < iconKeys.length; i += 1) {
        it(`renders ${iconKeys[i]} symbol without crashing`, () => {
            const div = document.createElement('div');
            ReactDOM.render(<iconGenerator type={ iconKeys[i] } />, div);
            ReactDOM.unmountComponentAtNode(div);
        });
    }
});

当我 运行 test:coverage 它显示任何 icon.js 文件的覆盖率为 0,即使它们被渲染得很好并且我得到 100% 的覆盖率 icongenerator.js 文件。有什么想法吗?

看起来您不需要或呈现任何图标文件,只是一个 iconGenerator 具有许多不同类型的组件,然后更改类名。要覆盖各种 icon*.js,您需要 require/render 它们,您也可以循环执行。

更高级别,我不确定您的图标生成器实际上如何 'generates' 图标,它看起来像一个呈现跨度的常规 ol' 组件。当然,这绝对有效!但它没有创建其他组件。