javascript - 如何 Stub webpack 的 require.ensure?

标签 javascript reactjs webpack mocha.js sinon

我使用 webpack的代码拆分功能 ( require.ensure ) 以减少我的 React 的初始包大小通过从异步加载的单独包中加载在页面加载时不可见的组件来应用程序。

这很完美,但是我在为它编写单元测试时遇到了问题。

我的测试设置基于 Mocha , ChaiSinon .

这是我迄今为止尝试过的代码的相关摘录:

describe('When I render the component', () => {
    let component,
        mySandbox;
    beforeEach(() => {
        mySandbox = sandbox.create();
        mySandbox.stub(require, 'ensure');
        component = mount(<PageHeader />);
    });
    describe('the rendered component', () =>
        it('contains the SideNav component', () =>
            component.find(SideNav).should.have.length(1)
        )
    );
    afterEach(() => mySandbox.restore());
});

运行测试时,我收到此错误消息:

"before each" hook for "contains the SideNav component": Cannot stub non-existent own property ensure

发生这种情况是因为 require.ensure 是一种只存在于 webpack 包中的方法,但我没有将我的测试与 webpack 捆绑在一起,我也不想这样做,因为它会产生更多开销并且可能需要更长的测试执行时间。

所以我的问题是:

有没有办法在不通过 webpack 运行测试的情况下使用 Sinon 对 webpack 的 require.ensure 进行 stub ?

最佳答案

每个模块都有自己的 require 实例,所以模拟 require.ensure 的唯一方法是围绕 require 进行某种抽象以获得这个独特的 require 来自测试中所需的模块,然后将 ensure() 的模拟添加到该 require 实例。

你可以使用 babel-plugin-rewire并使用 getter 获取 require,比如

const require = myComponent.__get__('require');
require.ensure = () => { /* mock here */};

我不是 100% 确定它会起作用,但我肯定会尝试朝这个方向前进。我推荐阅读 this issue在 github 上与您的问题相关并解释了很多。

关于javascript - 如何 Stub webpack 的 require.ensure?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44114737/

相关文章:

javascript - webpack:如何从 "bower_components"获取 JavaScript,而不是从 "node_modules"获取 JavaScript

javascript - CKEDITOR getData() 返回 html 字符实体(unicode),但是如何获得未翻译的字符?

javascript - Firefox 是否允许使用 "aggregated"火焰图分析 JS 应用程序?

javascript - React 的 setState 是异步的还是什么?

javascript - 覆盖 Webpack 4.25.1 在生产模式下对 Uglify 的使用

reactjs - 得到错误 : Plugin/Preset files are not allowed to export objects, 仅功能

javascript - 控制导航样式的 JQuery 函数(每个导航选择有不同的颜色)

javascript - 在 Javascript 中扩展对象

javascript - 什么时候调用 React.render() 回调?

reactjs - 为什么对象作为 react 子对象无效?什么是有效的 children 的 react 以及为什么?