Vous avez obtenu cette erreur après la mise à niveau vers React lorsque j'ai exécuté mes tests unitaires Jest
Réagir dépend de requestAnimationFrame. Assurez-vous de charger un polyfill dans les anciens navigateurs.
Comment je le répare?
J'utilise Jest 18.1.0.
Trouvé une solution de contournement!
Pas:
__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;
Comme indiqué sur les commentaires sur le code
Voici la solution de https://github.com/facebook/react/issues/9102#issuecomment-283873039
cela a fonctionné pour moi:
raf
npm install --saveDev raf
ou yarn add -D raf
setupFiles
dans votre jest
config dans package.json
comme ceci:'setupFiles': ['raf/polyfill']
Remarque: si vous avez d'autres fichiers d'installation dans ce tableau, vous voudrez peut-être d'abord mettre raf/polyfill
.
Si vous avez juste besoin de le polyfiler pour les tests, vous n'avez pas besoin de la limitation.
Créez un nouveau fichier avec ce code:
global.requestAnimationFrame = function (cb) {
return setTimeout(cb, 0);
};
Ajoutez ce fichier au tableau jest/setupFiles
dans votre package.json.
Si vous utilisez create-react-app, certaines de ces solutions ne fonctionneront pas bien (ou pas du tout, dans le cas de setupFiles
). Ce qui fonctionne bien, c’est créer un fichier dans src/setupTests.js
et y ajouter votre maquette:
global.requestAnimationFrame = (cb) => { cb(); };
Vous pouvez également ajouter d’autres simulations globales (par exemple, localStorage
et navigator.serviceWorker
).
Une autre solution de travail!
L'idée est de charger une simple cale avant chaque spécification, en utilisant la propriété setupFiles dans la configuration jest.
Créez un fichier fichier shim.js
(de préférence dans votre répertoire racine) et insérez le code correspondant:
global.requestAnimationFrame = (callback) => {
setTimeout(callback, 0);
};
Ensuite, vous rencontrez peut-être un code redondant qui réapparaît dans tous/la plupart de vos fichiers - et vous souhaitez les placer dans un seul fichier et les exécuter avant chaque spécification également, pour le faire:
Créez également un fichier setup.js
dans le répertoire racine. Un bon morceau de code redondant à D.R.Y est le code de configuration de l'adaptateur enzyme enzyme. Collez-le ici
import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';
Enzyme.configure({ adapter: new Adapter() });
Maintenant, créez le fichier jest.config.js
, pour spécifier les chemins des deux fichiers
{
module.exports = {
"setupFiles": ["<rootDir>shim.js", "<rootDir>setup.js"]
}
}
N.B: Le fichier de configuration Jest prend json
, alors assurez-vous que json est entré. De plus, si vos fichiers shim.js
et setup.js
ne se trouvent pas dans le même répertoire que votre jest.config.js
, ajustez le chemin en conséquence.
J'espère que cela t'aides!
Voici un moyen réaliste de simuler 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;
}
});
});
dans votre test, le rappel de la RAF est répété jusqu'à ce qu'il atteigne le temps écoulé maximal défini. Cela se produit instantanément, vous n'avez donc pas besoin de le bloquer.
Il suffit de mettre à jour votre react-scripts
vers 1.0.15 ou plus. Il a été officiellement corrigé après cette version. Voir plus de détails dans https://github.com/facebook/create-react-app/issues/3199
Rechercher dans le commentaire de gaearon commented on 31 Oct 2017