Error de relleno de polyfill 'requestAnimationFrame' en las pruebas de Jest


Obtuve este error después de actualizar a React cuando ejecuté mis pruebas unitarias de Jest:

React depende de requestAnimationFrame. Asegúrese de cargar un polyfill en navegadores antiguos.

¿Cómo lo arreglo?

Estoy usando Jest 18.1.0.

Author: Yangshun Tay, 2017-04-25

7 answers

Encontrado una solución!

Pasos:

  1. Crea el archivo __mocks__/react.js
  2. Añádase lo siguiente a __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;
  1. Ejecutar broma !

Como se indica en los comentarios sobre el código

Esta es la solución de https://github.com/facebook/react/issues/9102#issuecomment-283873039

 29
Author: Atul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-13 06:52:04

Esto funcionó para mí:

  1. Instalar raf

npm install --saveDev raf o yarn add -D raf

  1. Añade el polyfill a tu setupFiles en tu jest config en package.json así:

'setupFiles': ['raf/polyfill']

Nota: si tiene otros archivos de instalación en esta matriz, es posible que desee poner raf/polyfill primero.

 26
Author: Soska,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-17 14:16:53

Si solo necesita rellenarlo para pruebas, entonces realmente no necesita la limitación.

Crea un nuevo archivo con este código:

global.requestAnimationFrame = function (cb) {
    return setTimeout(cb, 0);
};

Agregue ese archivo a la matriz jest/setupFiles en su paquete.json.

 8
Author: sbaechler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-15 08:20:11

Si está utilizando create-react-app, algunas de estas soluciones no funcionarán bien (o en absoluto, en el caso de setupFiles). Lo que funciona bien es crear un archivo en src/setupTests.js y agregar su mock allí:

global.requestAnimationFrame = (cb) => { cb(); };

También puede agregar otras burlas globales allí (por ejemplo, localStorage y navigator.serviceWorker).

 3
Author: smfoote,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-24 21:29:26

Otra solución de trabajo!

La idea es cargar un shim simple antes de cada especificación, usando la propiedad setupFiles en la configuración de jest.

Cree un archivo shim.js (preferiblemente en su directorio raíz) y tenga este código en él:

global.requestAnimationFrame = (callback) => {
    setTimeout(callback, 0);
};

A continuación, es posible que tenga código redundante que reaparezca en todos / la mayoría de sus archivos , y desea ponerlos en un solo archivo y ejecutarlos antes de cada especificación también, para hacer eso:

Crear un archivo setup.js en la raíz dir también. Una buena pieza de código redundante para D. R. Y es el código de configuración del adaptador de enzima react. Pégalo aquí

import Enzyme from 'enzyme';
import Adapter from 'enzyme-adapter-react-16';

Enzyme.configure({ adapter: new Adapter() });

Ahora cree el archivo jest.config.js, para especificar las rutas de los dos archivos

{
    module.exports = {
        "setupFiles": ["<rootDir>shim.js", "<rootDir>setup.js"]
    }
}

N.b.: El archivo de configuración de jest toma json, así que asegúrate de que json está dentro. Además, si sus archivos shim.js y setup.js no están en el mismo directorio que su jest.config.js, ajuste la ruta en consecuencia.

Espero que esto ayude!

Crédito: https://github.com/facebook/jest/issues/4545

 1
Author: Ruto Collins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 13:14:22

Simplemente actualice su react-scripts a la versión 1.0.15 o superior. Ha sido oficialmente arreglado después de esa versión. Ver más detalles en https://github.com/facebook/create-react-app/issues/3199

Buscar en el comentario de gaearon commented on 31 Oct 2017

 0
Author: Kevin Li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 03:38:25

Resulta que fue porque actualizé enzyme sin actualizar react y react-dom.

React 15.5 trae consigo algunas desaprobaciones que causaron que muchas bibliotecas dependientes también tuvieran que actualizarse. Asegúrese de que está actualizando react, react-dom y compruebe el README de esos paquetes dependientes para las nuevas bibliotecas que tiene que instalar. Por ejemplo, la Enzima 2.8.2 ahora requiere react-addons-test-utils como dependencia.

 -1
Author: Yangshun Tay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-25 10:16:06