unit-testing - 使用 Jest 测试 Webpack 构建的 React 组件

标签 unit-testing reactjs webpack jestjs webpack-style-loader

我遇到了一个问题,我需要在由 Webpack 构建的 React 应用程序上运行 Jest 测试。问题是处理 Webpack 通常使用加载器处理的 CSS 文件和图像等的 require 。我需要知道正确测试组件的最佳方法是什么。

React 组件:

import React from 'react';
// The CSS file is the problem as I want to actually test what it
// returns after webpack has built it.
import style from './boilerplate.css';

var Boilerplate = React.createClass({
    render: function() {
        return (
            <div>
                <h1 className={style.title}>react-boilerplate</h1>
                <p className={style.description}>
                    A React and Webpack boilerplate.
                </p>
            </div>
        );
    }
});

export default Boilerplate;

Jest 测试:

jest.dontMock('./boilerplate.js');

var Boilerplate = require('./boilerplate.js');
var React = require('react/addons');
var TestUtils = React.addons.TestUtils;

describe('boilerplate', function() {

    var component;

    beforeEach(function() {
        component = TestUtils.renderIntoDocument(
            <Boilerplate />
        );
    });

    it('has a h1 title', function() {
        // I want to actually use 'findRenderedDOMComponentWithClass'
        // but cannot because I need to run the Webpack build to add a
        // CSS class to this element.
        var title = TestUtils.findRenderedDOMComponentWithTag(component, 'h1');
        expect(title.getDOMNode().textContent).toEqual('react-boilerplate');
    });

    it('has a paragraph with descriptive text', function() {
        var paragraph = TestUtils.findRenderedDOMComponentWithTag(component, 'p');
        expect(paragraph.getDOMNode().textContent).toEqual('A React and Webpack boilerplate.');
    });

});

我遇到过this question这让我放心,我自己尝试了所有这些方法,但我对遇到的所有解决方案都有疑问:

解决方案 1: 使用 scriptPreprocessor 文件去除 requires 需要 Webpack 构建的非 Javascript 文件,例如需要 .css.less.jpegs 等。这样我们就可以测试 React 组件,但不能测试其他任何东西。

问题:我想测试 Webpack 构建创建的一些功能。例如,我使用本地、可互操作的 CSS,我想测试从 Webpack 创建的 require('whaterver.css') 返回的 CSS 类的对象。我还想使用 React/TestUtils 中的 findRenderedDOMComponentWithClass 这意味着我需要通过 Webpack 构建 CSS。

解决方案 2: 使用 scriptPreprocessor 脚本通过 Webpack 运行组件并构建一个测试文件(如 jest-webpack 那样)并在此输出上运行测试。

问题:我们无法再使用 Jest 的自动模拟,因为我们现在将使用 Webpacks __webpack_require__(1)。每次运行测试文件时,构建速度也很慢。

解决方案 3: 与解决方案 2 非常相似,但在运行 npm test 之前仅对所有测试文件运行一次构建,以解决构建时间过长的问题。

问题:与解决方案 2 相同。没有自动模拟。

我在这里走错路了吗?或者有人对此有任何答案吗?我错过了显而易见的事情吗?

最佳答案

我最近构建了Jestpack它将 Jest 与 Webpack 集成,这意味着您可以使用 Webpack 的所有功能,包括 CSS 模块、文件加载、代码分割、CommonJS/AMD/ES2015 导入等以及 Jest 的自动模拟。

关于unit-testing - 使用 Jest 测试 Webpack 构建的 React 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31547587/

相关文章:

unit-testing - Jasmine 监视调用外部方法的方法(Angular 2)

java - 服务测试中的 NullPointerException

javascript - 快照时间戳不匹配

python - Django 更新表单的单元测试

javascript - 如何使用 Jest 解决模拟函数内的外部 promise ?

reactjs - 如何在 React 组件中嵌入 Github Gist?

javascript - setTimeout 运行其回调代码比没有它慢得多

angular - 如何使用 Webpack 或 Angular CLI 将 Angular 元素编译成 Web 组件?

javascript - webpack 没有正确添加 [contenthash] 到我的 .js 文件

javascript - Webpack 找不到入口模块