私はこのコンポーネントを持っています:
import React from 'react';
import VideoTag from './VideoTag';
import JWPlayer from './JWPlayer';
class VideoWrapper extends React.Component {
//... component code
}
いくつかのロジックに基づくと、内部に別のコンポーネント(VideoTagまたはJWPlayer)がレンダリングされますが、jestファイルでテストしようとすると、エラーが発生します。
モジュール './VideoTag'が見つかりません
3つのコンポーネントは同じディレクトリにあるため、トランスパイルしてブラウザで動作を確認すると実際に機能しますが、Jestがこれらの相対パスの解決に問題があるようです。これはjestファイルです。
jest.dontMock('../src/shared/components/Video/VideoWrapper.jsx');
import React from 'react';
import ReactDOM from 'react-dom';
TestUtils from 'react-addons-test-utils';
import VideoWrapper from '../src/shared/components/Video/VideoWrapper.jsx';
describe('VideoWrapper tests', () => {
it('Render JWPlayer', () => {
let vWrapper = TestUtils.renderIntoDocument(
< VideoWrapper model={model} />
);
});
});
エラーは次の行にあります。
import VideoWrapper from '../src/shared/components/Video/VideoWrapper.jsx';
相対パスの処理方法をjestに指示するにはどうすればよいですか?
問題はパスではなく、.js拡張子を持つモジュールのみを探していました。jest構成に.jsxを追加した後に機能しました。
"moduleFileExtensions": [
"js",
"jsx"
]
また、セットアップしたパスマップをテストで認識できるようにするために、tsconfigパスマップのjest構成にmoduleNameMapper
を追加する必要がありました。このようなもの:
"moduleNameMapper": {
"^yourPath/(.*)": "<rootDir>\\yourPath\\$1"
}
うまくいけば、これは将来の誰かを助けるでしょう!
Jestはデフォルトのファイル拡張子として['js'、 'jsx'、 'json'、 'node']を使用するため、これら2つのオプションの構成にmoduleFileExtensionsを追加する必要はありません。 (特にオプションをスキップしたい場合を除きます)
TypeScriptでJestを使用しようとしてここで終わる他の人のために:あなたはts
にmoduleFileExtensions
を含める必要があります。例:
"moduleFileExtensions": [
"js",
"jsx",
"json",
"node",
"ts"
]
*.ts
ファイルの変換も必要です。
transform: {
"^.+\\.vue$": "vue-jest",
"^.+\\.js$": "babel-jest",
"^.+\\.(ts|tsx)$": "ts-jest"
},