假设我有以下模块:

var modulesReq = require.context('.', false, /\.js$/);
modulesReq.keys().forEach(function(module) {
  modulesReq(module);
});

Jest 提示是因为它不知道 require.context :
 FAIL  /foo/bar.spec.js (0s)
● Runtime Error
  - TypeError: require.context is not a function

我怎么能 mock 它?我尝试使用 setupTestFrameworkScriptFile Jest 配置,但测试看不到我在 require 中所做的任何更改。

最佳答案

我遇到了同样的问题,然后我做了一个“解决方案”。

我很确定这不是最佳选择。根据此处回答的要点,我最终停止使用它:

https://github.com/facebookincubator/create-react-app/issues/517
https://github.com/facebook/jest/issues/2298

但是如果你真的需要它,你应该在你调用它的每个文件中包含下面的 polyfill(不是在测试文件本身,因为 require 在 Node 环境中不会被全局覆盖)。

// This condition actually should detect if it's an Node environment
if (typeof require.context === 'undefined') {
  const fs = require('fs');
  const path = require('path');

  require.context = (base = '.', scanSubDirectories = false, regularExpression = /\.js$/) => {
    const files = {};

    function readDirectory(directory) {
      fs.readdirSync(directory).forEach((file) => {
        const fullPath = path.resolve(directory, file);

        if (fs.statSync(fullPath).isDirectory()) {
          if (scanSubDirectories) readDirectory(fullPath);

          return;
        }

        if (!regularExpression.test(fullPath)) return;

        files[fullPath] = true;
      });
    }

    readDirectory(path.resolve(__dirname, base));

    function Module(file) {
      return require(file);
    }

    Module.keys = () => Object.keys(files);

    return Module;
  };
}

使用此函数,您无需更改任何 require.context 调用,它将以相同的行为执行(如果它在 webpack 上,它将只使用原始实现,如果它在 Jest 执行中,使用 polyfill 函数) .

关于javascript - 如何在 Jest 中模拟 Webpack 的 require.context?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38332094/

10-16 12:22