私はWebpack&Jestでプロジェクトをセットアップする作業をしています。現時点では、Webpackの解決構成により、Jestテストが複雑になります。私のwebpack構成では、次のオプションを設定しています。
resolve: {
root: [__dirname + "/src/" ],
extensions: ['', '.js', '.coffee', '.jsx', '.css', '.scss', '.svg']
}
これにより、以下のアセットとモジュールが必要になります。
import UnknownImg from 'assets/unknown';
上記は実際に生きています(私のプロジェクトルートに対して)src/assets/unknown.svg
。
ただし、上記のような行を含むファイルのテストを実行すると、必要なモジュール/アセットへのパスを解決するときにエラーが発生します。
Error: /Users/byronsm/dev/nerve-center/src/components/organisms/system_status.jsx: Cannot find module 'assets/unknown' from '/Users/byronsm/dev/nerve-center/src/components/organisms'
この場合、インポートされたモジュールパスの相対ルックアップを実行しているようです。 JestをWebpackと同じように動作させる方法はありますか?
ソリューションは、公式のjest docsで提供されています。 Webpackチュートリアル を参照してください。
簡単に言うと、modulePaths
オプションをjest設定inpackage.json
に追加します。
"jest": {
"modulePaths": ["src"],
...
}
Jest 20+ resolver
option を使用して jest-webpack-resolver でプラグインできます
このパッケージは成熟したようには見えませんが(数日前)、私にとってはうまくいきます。また、現時点では、Jest構成を別のjest.config.js
ファイルに含めるか、CLI経由で提供する必要があります(package.json
はサポートされていません)。
Jestpack は、Jestで実行する前にWebpackでテストファイルを作成することにより、この問題を解決することを目的としています。つまり、Webpack構成内の特別なモジュール解決ルールまたはローダーは、本番ビルドとまったく同じように機能します。
おやすみの休憩の後、私は再びこれを見て、それがJest構成ではなくノードであることに気付きました。 webpackのresolve.root構成の動作を模倣する最良の方法は、jest
の実行時に環境変数NODE_PATH
を同じディレクトリに設定することです。
NODE_PATH=src jest
それは実際には私の問題を解決した複数のディレクトリの問題を解決しません。この記事は、ソリューションを少しよく理解するのに役立ちました https://Gist.github.com/branneman/804852 。
私が書いた - mimic-webpack
webpack構成を取得し、webpackのようにパスを解決するためにノードのrequireにフックします。私はjestでテストしていませんが、nodeで実行され、単純なローダーもサポートするスペックランナーで動作するはずです。
Jestバージョン23.6.0
:
この行をjest.config.js
に追加します
moduleDirectories: ["node_modules", "src"],
またはpackage.json
"jest": {
"moduleDirectories": ["node_modules", "src"],
...
}