15

我刚刚开始使用 Jest 测试框架,虽然直接的单元测试工作正常,但我在测试其模块(通过 babel+webpack 的 ES 模块)中需要 HTML 文件的任何组件时遇到大量问题。

这是一个例子:

import './errorHandler.scss';
import template from './errorHandler.tmpl';

class ErrorHandler {
    ...

我正在加载我在 Jest 的package.json配置中设置的组件特定 SCSS 文件以返回一个空对象,但是当 Jest 尝试运行该import template from './errorHandler.tmpl';行时,它会中断说:

/Users/jannis/Sites/my-app/src/scripts/errorHandler/errorHandler.tmpl.html:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){<div class="overlay--top">
                                                                                         ^
    SyntaxError: Unexpected token <

        at transformAndBuildScript (node_modules/jest-runtime/build/transform.js:284:10)

我的 Jest 配置package.json如下:

"jest": {
    "setupTestFrameworkScriptFile": "<rootDir>/test/setupFile.js",
    "moduleDirectories": ["node_modules"],
    "moduleFileExtensions": ["js", "json", "html", "scss"],
    "moduleNameMapper": {
        "^.+\\.scss$": "<rootDir>/test/styleMock.js"
    }
}

似乎 webpackhtml-loader不能与 Jest 一起正常工作,但我找不到任何解决方案来解决这个问题。

有谁知道我怎样才能让这些html-loader import在我的测试中发挥作用?他们加载了我的 lodash 模板标记,我宁愿有时在我的.js文件中没有这些大量的 HTML 块,所以我可以省略这import template from x部分。

PS:这不是一个 React 项目,只是普通的 webpack、babel、es6。

4

4 回答 4

22

我最近遇到了这个特定的问题,创建自己的转换预处理器将解决它。这是我的设置:

包.json

"jest": {
    "moduleFileExtensions": [
      "js",
      "html"
    ],
    "transform": {
      "^.+\\.js$": "babel-jest",
      "^.+\\.html$": "<rootDir>/test/utils/htmlLoader.js"
    }
 }

注意:默认情况下通常包含 babel-jest,但如果您指定自定义转换预处理器,您似乎必须手动包含它。

测试/实用程序/htmlLoader.js:

const htmlLoader = require('html-loader');

module.exports = {
    process(src, filename, config, options) {
        return htmlLoader(src);
    }
}
于 2017-01-09T22:27:33.123 回答
11

聚会有点晚了,但想补充一点,如果你想走那条路,还有这个html-loader-jest npm 包可以做到这一点。

一旦你 npm install 它,你将把它添加到你的笑话配置中

"transform": {
        "^.+\\.js$": "babel-jest",
        "^.+\\.html?$": "html-loader-jest"
    }
于 2019-03-13T14:38:50.343 回答
0

也许您自己的预处理器文件将是解决方案:

脚本预处理器

自定义预处理器

scriptpreprocessor:从预处理源文件提供同步功能的模块的路径。例如,如果您希望能够在模块或测试中使用节点尚不支持的新语言功能(例如 ES6 类),您可以插入将 ES6 编译为的众多转译器之一ES5 在这里。

transform-decorators-legacy在添加到我的 webpack 模块加载器后,当我的测试出现问题时,我创建了自己的预处理器。

于 2016-09-19T11:52:30.860 回答
0

html-loader-jest对我不起作用。我的解决方法:

"transform": {
  '\\.(html)$': '<rootDir>/htmlTemplateMock.html'
}

htmlTemplateMock.html是空文件

于 2021-06-04T11:10:16.257 回答