如何将外部内容从 webpack 传递给 jest?

Posted

技术标签:

【中文标题】如何将外部内容从 webpack 传递给 jest?【英文标题】:How to pass externals from webpack to jest? 【发布时间】:2017-04-22 11:11:27 【问题描述】:

我已经将这个 webpack 配置作为我繁重的构建过程的一部分:

module.exports = 
options: 
    output: 
        path: path.resolve('../ui/static/js'),
        filename: '[name].js',
        chunkFilename: '[id].[name].js',
        libraryTarget: 'amd',
        library: '[name]'
    ,

    externals: [
        'jquery',
        'lodash',
        'backbone',
        'backbone.layoutmanager',
        'moment',
        'spin',
        'lib/select2.min',
        'dispatcher'
    ],
    resolve: 
        root: path.resolve('../ui'),
        alias: 
            'jst': 'static/jst'
        
    

我们现在开始做出反应,我需要在我的测试文件中导入一些文件,其中包含这些依赖项,但是我找不到它们:

Cannot find module 'lib/select2.min' from 'helpers.js'
Cannot find module 'jst/templates_jst' from 'base-view.js

解决此问题的正确方法是什么?

【问题讨论】:

您是否尝试过使用安装文件并导入这些包并附加到global 是的。它在我的模板上失败了,它包含在 webpack 中,如下所示:resolve: root: path.resolve('../ui'), alias: 'jst': 'static/jst' 我开玩笑说:Cannot find module 'jst/templates_jst' from 'base-view.js' 我可以通过将 spin、jquery、backbone 添加到 __mocks__ 文件夹来防止错误,但我不知道如何处理 jst/templates_jst 另一种可能是使用虚拟模拟jest.mock('jst/templates_jst', () => , virtual: true) 【参考方案1】:

对于我的情况,使用 __mocks__ 会有点冗长,但我使用了

jest.mock('myModule', () => /* module impl */, virtual: true)

如果__mocks__ 的建议对您来说过于冗长,请查看文档here

【讨论】:

这太棒了,我在我执行的任何网络搜索中都没有看到这一点,这对外部库非常有用,我也不想在创建时如此冗长,谢谢你 优秀的答案。不知道这个virtual: true。它对我来说就像一个魅力!【参考方案2】:

您需要模拟外部库。

jquery 示例:

    在 __test__ 文件夹的同一级别创建一个 __mocks__ 文件夹。 在其中创建一个与依赖项同名的文件,在本例中为 jquery (jquery.js)。 在测试文件中,使用jest.mock函数引用mock外部依赖:jest.mock('jquery');

来自开玩笑的文档: https://facebook.github.io/jest/docs/manual-mocks.html

希望对你有帮助。

【讨论】:

这将如何解决问题?如果我在测试中模拟 react,它们将不再通过,因为我需要实际的 react 来渲染组件进行测试。 对于反应它当然无济于事,如果反应作为外部库,无论如何你必须将它放在依赖项中。但它适用于一些不影响您的测试的外部包,但仍然必须安装以解决导入和编译问题。这里的模拟很适合。【参考方案3】:

这就是今天适用于 webpack@4.11.1jest@23.1.0 的内容。假设这是你的外部 webpack 配置:

externals: 
  react: 
    root: 'React',
    commonjs2: 'react',
    commonjs: 'react',
    amd: 'react',
  ,

您需要映射每个外部库以在您的 jest 配置中正确解析,如下所示:

moduleNameMapper: 
  "^./react": path.resolve(__dirname, 'node_modules/react'),

在调试您的问题时,请务必检查您构建的组件文件的外观。您要确保看到类似以下内容:

!function(e,t)if("object"==typeof exports&&"object"==typeof module)
module.exports=t(require("react"));
else if("function"==typeof define&&define.amd)define(["react"],t);
elsevar n="object"==typeof exports?t(require("react")):t(e.React);

react 用于 commonjs 和 amd,React 用于浏览器。

【讨论】:

以上是关于如何将外部内容从 webpack 传递给 jest?的主要内容,如果未能解决你的问题,请参考以下文章

在 Jest 测试中使用 Webpack 的 DefinePlugin 变量

用 jest 模拟对象并通过方法参数传递

如何将用户输入从节点服务器传递到外部 api 调用?

如何在 React 和 Webpack 中使用 Jest

如何将变量从外部 JavaScript 传递到 HTML 表单

如何将变量传递给外部汇编函数