Broma con coffeescript jsx?

¿Cómo puedo usar Jest para probar los componentes React escritos en CoffeeScript + React jsx?

El único ejemplo de CoffeeScript provisto con Jest usa CoffeeScript simple, y no funciona con CoffeeScript + React JSX (error de syntax cuando llega a < ).

Lo que he intentado

primer bash: execSync

 // preprocessor.js var execSync = require('exec-sync'); module.exports = { process: function (src, path) { return execSync('browserify -t coffee-reactify ' + path); } }; 

Esto funciona, pero lleva demasiado tiempo (unos buenos 12 segundos para una prueba ficticia).

Entonces intenté:

segundo bash: transformar-reactjsr-café

 // preprocessor.js var coffee = require('coffee-script'); var transform = require('coffee-react-transform'); module.exports = { process: function(src, path) { if (path.match(/\.coffee$/)) { return coffee.compile(transform(src), {'bare': true}); } return src; } }; 

Esto arroja un error extraño, como:

TypeError: function () {…} no tiene el método ‘getPooled’

El único resultado de Google para “no tiene ningún método ‘getPooled'” es esta esencia , que muestra exactamente el error que recibí, pero no ofrece ninguna otra información.

tercer bash posible

Creo que podría usar coffee-reactify , pero devuelve un flujo, que es asíncrono, mientras que la función de process en preprocess.js se usa de forma sincrónica, y hasta ahora no he encontrado la manera de leer un flujo de forma sincrónica.

¿Que puedo hacer?

Creo que su segundo enfoque fue correcto, excepto que no (supongo que aquí), agregue reactjsr a “unmockedModulePathPatterns” en la propiedad jest de package.json. Ese suele ser el resultado del error getPooled en mi experiencia.

Los siguientes trabajos para mí:

paquete.json

  // ... "jest": { "unmockedModulePathPatterns": ["/node_modules/react"], "testFileExtensions": [ "js", "coffee" ], "scriptPreprocessor": "/preprocessor.js" } 

preprocessor.js

 // I found it simpler to use coffee-react, // since it does the jsx transform and coffeescript comstacktion var coffee = require('coffee-react'); module.exports = { process: function(src, path) { if (path.match(/\.coffee$/)) { return coffee.compile(src, {bare: true}); } return src; } }; 

Todo este proceso es difícil de solucionar porque los errores pueden ocurrir en cualquier lugar durante la tubería jsx -> coffee -> js -> jest y ser tragados en silencio. Encontré muy útil solucionar este problema ejecutando la transformación en un archivo separado para asegurarme de que jsx -> coffee and coffee -> js sucedió correctamente, y luego ejecutar el preprocesador jest.

Acabo de publicar una prueba de unidad de placa de caldera para Jest que funciona con React & CoffeeScript.

https://github.com/Cotidia/jest-react-coffeescript

El preprocesador debe ser el siguiente:

 var coffee = require('coffee-script'); var ReactTools = require('react-tools'); module.exports = { process: function(src, path) { // console.log('src', src); if (path.match(/\.coffee$/)) { // First we compile the coffeescript files to JSX compiled_to_js = coffee.compile(src, {bare: true}); // Then we compile the JSX to React compiled_to_react = ReactTools.transform(compiled_to_js) return compiled_to_react; } return src; } }; 

Basado en el proyecto de plantilla del usuario 2534631, mejoré para usar coffee-reaccion-transform para comstackr archivos CJSX.

https://github.com/redice/jest-react-coffeescript

 var coffee = require('coffee-script'); var transform = require('coffee-react-transform'); module.exports = { process: function(src, path) { if (coffee.helpers.isCoffee(path)) { compiled_cjx = transform(src); compiled_to_react = coffee.compile(compiled_cjx, {bare: true}); return compiled_to_react; } return src; } }; 

Entonces use la syntax CJSX para escribir componentes React.

 render: ->