React and Babel。)で最初のJestテストに合格しようとしています。
次のエラーが表示されます。
SyntaxError:/Users/manueldupont/test/avid-sibelius-publishing-viewer/src/components/TransportButton/TransportButton.less:予期しないトークン
> 7 | @import '../variables.css';
| ^
Jestのpackage.jsonの構成は次のようになります。
"babel": {
"presets": [
"es2015",
"react"
],
"plugins": [
"syntax-class-properties",
"transform-class-properties"
]
},
"jest": {
"moduleNameMapper": {
"^image![a-zA-Z0-9$_-]+$": "GlobalImageStub",
"^[./a-zA-Z0-9$_-]+\\.png$": "RelativeImageStub"
},
"testPathIgnorePatterns": [
"/node_modules/"
],
"collectCoverage": true,
"verbose": true,
"modulePathIgnorePatterns": [
"rpmbuild"
],
"unmockedModulePathPatterns": [
"<rootDir>/node_modules/react/",
"<rootDir>/node_modules/react-dom/",
"<rootDir>/node_modules/react-addons-test-utils/",
"<rootDir>/node_modules/fbjs",
"<rootDir>/node_modules/core-js"
]
},
だから私は何が欠けていますか?
moduleNameMapper
は、異なる拡張子を持つファイルを解釈する方法をJestに指示する設定です。 Lessファイルの処理方法を伝える必要があります。
プロジェクトで次のようなファイルを作成します(必要に応じて別の名前またはパスを使用できます)。
config/CSSStub.js
module.exports = {};
このスタブは、CSSまたはLessファイルの代わりに使用するようにJestに指示するモジュールです。次に、moduleNameMapper
設定を変更し、この行をオブジェクトに追加して使用します。
'^.+\\.(css|less)$': '<rootDir>/config/CSSStub.js'
Jestは、空のオブジェクトをエクスポートするモジュールとしてCSSまたはLessファイルを扱います。他のこともできます。たとえば、CSSモジュールを使用する場合は、プロキシを使用して、インポートするたびにインポートしたプロパティ名を返すことができます。
詳細はこちらをご覧ください ガイド 。
Package.jsonファイルのjest設定でmoduleNameMapper
キーを使用してこれを解決しました
{
"jest":{
"moduleNameMapper":{
"\\.(css|less|sass|scss)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
}
}
}
この後、以下で説明するように2つのファイルを作成する必要があります。
__mocks__/styleMock.js
module.exports = {};
__mocks__/fileMock.js
module.exports = 'test-file-stub';
CSSモジュールを使用している場合は、プロキシを模倣してclassNameルックアップを有効にすることをお勧めします。したがって、構成は次のように変更されます。
{
"jest":{
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(css|less|scss|sass)$": "identity-obj-proxy"
},
}
}
ただし、identity-obj-proxy
パッケージをdev依存関係としてインストールする必要があります。
yarn add identity-obj-proxy -D
詳細については。 jest docs を参照できます
2018年2月のcreate-react-appを使用するUPDATE。パッケージ内のmoduleNameMapperをオーバーライドすることはできません。 jsonですが、jest.config.jsで動作しますが、残念ながら、この理由についてのドキュメントは見つかりませんでした。したがって、私のjest.config.jsは次のようになります。
module.exports = {
...,
"moduleNameMapper": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js",
"\\.(scss|sass|css)$": "identity-obj-proxy"
}
}
また、scssファイルと@importを非常にうまくスキップします。
私の答えを支持しました jest webpack
同様の状況で、identity-object-proxyをインストールし、それをCSSのjest configに追加することでうまくいきました。
//jest.config.js
module.exports = {
moduleNameMapper: {
"\\.(css|sass)$": "identity-obj-proxy",
},
};
私が見ていた特定のエラー:
Jest encountered an unexpected token
/Users/foo/projects/crepl/components/atoms/button/styles.css:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){.button { }
^
SyntaxError: Unexpected token .
1 | import React from 'react';
> 2 | import styles from './styles.css';
次をpackage.json
に追加すると、この問題は解決しました。
"jest": {
"moduleNameMapper": {
".+\\.(css|scss|png|jpg|ttf|woff|woff2)$": "jest-transform-stub"
}
}
そしてもちろん、yarn add -D jest-transform-stub
を実行する必要があります