React=にアップグレードした後、Jestユニットテストを実行したときにこのエラーが発生しました。
ReactはrequestAnimationFrameに依存します。古いブラウザでポリフィルを必ずロードしてください。
どうすれば修正できますか?
Jest 18.1.0を使用しています。
回避策を見つけました!
手順:
__mocks__/react.js
を作成します__mocks__/react.js
に追加しますconst react = require('react');
// Resolution for requestAnimationFrame not supported in jest error :
// https://github.com/facebook/react/issues/9102#issuecomment-283873039
global.window = global;
window.addEventListener = () => {};
window.requestAnimationFrame = () => {
throw new Error('requestAnimationFrame is not supported in Node');
};
module.exports = react;
コードのコメントにマークされているとおり
これは https://github.com/facebook/react/issues/9102#issuecomment-283873039 からのソリューションです
これは私のために働いた:
raf
npm install --saveDev raf
またはyarn add -D raf
setupFiles
のポリフィルをjest
のpackage.json
の設定に追加するには、次のようにします。'setupFiles': ['raf/polyfill']
注:この配列に他のセットアップファイルがある場合は、raf/polyfill
を最初に配置することをお勧めします。
テストのためにポリフィルする必要がある場合は、実際に調整する必要はありません。
このコードで新しいファイルを作成します。
global.requestAnimationFrame = function (cb) {
return setTimeout(cb, 0);
};
そのファイルをpackage.jsonのjest/setupFiles
配列に追加します。
Create-react-appを使用している場合、これらのソリューションの一部はうまく機能しません(setupFiles
の場合はまったく機能しません)。うまく機能するのは、src/setupTests.js
にファイルを作成し、そこにモックを追加することです。
global.requestAnimationFrame = (cb) => { cb(); };
他のグローバルモックをそこに追加することもできます(例:localStorage
およびnavigator.serviceWorker
)。
別の実用的なソリューション!
Jest configのsetupFilesプロパティを使用して、各仕様の前に単純なシムをロードするという考え方です。
ファイルshim.js
ファイル(ルートディレクトリにあることが望ましい)を作成し、次のコードを含めます。
global.requestAnimationFrame = (callback) => {
setTimeout(callback, 0);
};
次に、すべての/ほとんどのファイルに繰り返し現れる冗長なコードがあるかもしれません-そしてそれらを単一のファイルに入れて、各仕様の前にも実行させたいのです:
ルートディレクトリにもsetup.js
ファイルを作成します。 D.R.Yの優れた冗長コードは、反応酵素アダプターの構成コードです。ここに貼り付けます
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
jest.config.js
ファイルを作成して、2つのファイルのパスを指定します
{
module.exports = {
"setupFiles": ["<rootDir>shim.js", "<rootDir>setup.js"]
}
}
NB:jest設定ファイルはjson
を取るため、json 'sを確認してくださいin。また、shim.js
およびsetup.js
ファイルがjest.config.js
と同じディレクトリにない場合は、それに応じてパスを調整します。
お役に立てれば!
RequestAnimationFrameをモックする現実的な方法を次に示します。
let time;
const maxTimeElapsed = 2000;
beforeEach(() => {
time = 0;
jest.spyOn(window, 'requestAnimationFrame').mockImplementation(cb => {
time += 100;
if (time < maxTimeElapsed) {
return cb(time) as any;
}
});
});
テストでは、設定した最大経過時間に達するまでRAFコールバックを繰り返し呼び出します。すぐに発生するため、ストールする必要はありません。
react-scripts
を1.0.15以降にアップグレードするだけです。それはそのバージョンの後に公式に修正されました。詳細については https://github.com/facebook/create-react-app/issues/3199 をご覧ください
gaearon commented on 31 Oct 2017
のコメントを検索