Webpack 和 Jest

Facebook 使用 Jest 来测试所有 JavaScript 代码,包括 React 应用程序。Jest 的一个理念是提供一个集成的零配置体验。我们观察到,当工程师提供即用型工具时,他们最终会编写更多测试,从而产生更稳定和健康的代码库。

完整的工作示例在 GitHub 上可用作 web-components-webpack-es6-boilerplate

Jest 使用 jsdomNodeJS 环境中运行测试。整个过程很简单。让我们考虑以下 webpack 设置,假设我们的项目结构如下所示:

-src
    --client
    --server
-webpack
    --config.js
package.json

一个简单的目录结构,旨在将 server render 逻辑与其余逻辑分开。 Webpack config.js 文件将包含以下模块:

  resolve: {
    modules: ["node_modules"],
    alias: {
      client: path.join(__dirname, "../src/client"),
      server: path.join(__dirname, "../src/server")
    },
    extensions: [".js", ".json", ".scss"]
  },

我们可以设置 Jest 来反映我们的 Webpack 配置。

module.exports = {
  setupTestFrameworkScriptFile: "<rootDir>/bin/jest.js",
  mapCoverage: true,
  moduleFileExtensions: ["js", "scss", "html"],
  moduleDirectories: ["node_modules"],
  moduleNameMapper: {
    "src/(.*)$": "<rootDir>/src/$1"
  },
  transform: {
    "^.+\\.(js|html|scss)$": "<rootDir>/bin/preprocessor.js"
  },
  testMatch: ["<rootDir>/test/**/?(*.)(spec|test).js"],
  testPathIgnorePatterns: ["<rootDir>/(node_modules|bin|build)"]
};

我们应该在哪里保存这个配置?

我们可以在 jest 密钥下的 package.json 文件中创建它,或者在项目根目录中创建如示例 jest.config.js 文件。

我们想要实现的是确保我们的 html 文件将被正确导入。这意味着通过自定义 preprocessor 转义它们,因为只使用 babel-jest 会在尝试解析非 js 文件时抛出错误。

另一个重要的事情是 setupTestFrameworkScriptFile 脚本,实际上包括 custom elements polyfills 到 jsdom。以下是我们的 preprocessor.js 的样子:

const babelJest = require("babel-jest");

const STYLE_URLS_REGEX = /styles:\s*\[\s*((?:'|").*\s*(?:'|")).*\s*.*\]/g;
const ESCAPE_TEMPLATE_REGEX = /(\${|\`)/g;

module.exports.process = (src, path, config) => {
  if (path.endsWith(".html")) {
    src = src.replace(ESCAPE_TEMPLATE_REGEX, "\$1");
    src = "module.exports=` + src + `;";
  }
  src = src.replace(STYLE_URLS_REGEX, "styles: []");

  return babelJest.process(src, path, config);
};

这个脚本的作用很简单:删除样式文件内容,因为我们不需要/想要测试它,以及转义模板,当我们导入它们时,例如使用 require('template.html') 语法。然后它将内容传递给 babel 变压器。

最后一件重要的事情是包括 web components polyfills。默认情况下,jsdom 尚不支持它们。要做到这一点,我们可以简单地在我们的示例中添加 setupTestFrameworkScriptFile,它是 jest.js,具有以下内容:

require("document-register-element/pony")(window);

这样我们就可以在 jsdom 中访问 web components API 了。

设置完所有后我们应该有这样的结构:

-bin
    --jest.js
    --preprocessor.js
-src
    --client
    --server
-webpack
    --config.js
-test
package.json
jest.config.js

我们将测试保存在 test 目录中,并可以使用命令运行:yarn run jest --no-cache --config $(node jest.config.js)