4

最近我将我的一个项目转换为 webpack & babel。它由敲除组件制成。

我在运行单元测试时遇到了问题。如果我在 测试文件夹中有一个文件,例如

import component from '../custom-options';

test('adds 1 + 2 to equal 3', () => {
  expect(3).toBe(3);
});

问题是该组件是一个需要排序的模块

var htmlString = require('./custom-options.html');

当我尝试运行网站本身时,它运行良好,因为原始加载程序是为此要求配置的。但是,当我开玩笑时,测试输出:

 custom-options.html:1
 ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){?<div id="custom-options-containe" class="mod--custom-options">
                                                                                          ^
SyntaxError: Unexpected token <

  at transformAndBuildScript (node_modules\jest-cli\node_modules\jest-runtime\build\transform.js:284:10)
  at custom-options.js:13:38
  at Object.<anonymous> (custom-options.js:93:3)

知道为什么会这样吗?我认为 jest 是错误的,但我尝试用 Ava 代替它,结果是一样的。我开始认为这是一个 babel 问题。

我正在使用 babel-jest 预处理器运行 jest。

4

2 回答 2

8

您可以在您的 jest 设置中为所有非 JS 文件创建一个全局模拟,package.json如下所示:

"jest": {
  "moduleNameMapper": {
    "^.+\\.html$": "<rootDir>/__mocks__/htmlMock.js"
  }
}

然后在项目根目录htmlMock.js的文件夹中创建文件,内容如下:__mocks__

module.exports = 'test-file-stub';

欲了解更多信息,请查看此处

如果你想为每个测试用例做一个特殊的模拟,你也可以在你的测试中模拟文件,如下所示:

jest.mock('path/from/test/to/custom-options.html', ()=> 'test-file-stub');

请注意,路径是相对于测试文件的,而不是相对于您要测试的文件。

于 2016-10-29T10:29:17.887 回答
2

你也可以jest-raw-loader用来模仿webpack 的raw-loader动作。您需要将其设置为transform,并确保还包含默认的babel-jest转换条目。

"jest": {
  "transform": {
    "\\.js$": "babel-jest",
    "\\.(html|xml|txt)$": "jest-raw-loader"
  }
}
于 2020-01-29T00:52:12.733 回答