Jest で Webpack の require.context をモックするにはどうすればよいですか? 質問する

Jest で Webpack の require.context をモックするにはどうすればよいですか? 質問する

次のようなモジュールがあるとします。

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

どうすればモックできますか?setupTestFrameworkScriptFileJest 構成ですが、テストでは で行った変更が認識されませんrequire

ベストアンサー1

私も同じ問題を抱えていましたが、解決策を見つけました。

これは最良の選択ではないと確信しています。ここで回答されている点から、私は結局これの使用をやめました。

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

ただし、本当に必要な場合は、呼び出すすべてのファイルに以下のポリフィルを含める必要があります ( requireNode 環境ではグローバルに上書きされないため、テスト ファイル自体には含めないでください)。

// 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 関数が使用されます)。

おすすめ記事