node.js - nyc - Corriendo Mocha+Estambul+Babel
istanbul mocha (3)
Tengo algunos problemas mientras ejecuto Estambul con mocha y el compilador de babel.
todas mis pruebas se están ejecutando bien, pero después de todas las pruebas, me muestra este mensaje:
No coverage information was collected, exit without writing coverage information
Y no está produciendo ningún informe de cobertura.
El comando que estoy ejecutando es:
NODE_ENV=test istanbul cover _mocha -- --require babel-core/register --recursive
el proyecto está alojado en github: https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24
¿Alguna idea de lo que podría ser?
PD: ahora recomiendo usar una sola jest lugar de mocha / instanbul / nyc / chai / etc.
Solución A: Usar nyc y babel-plugin-istanbul
Configuración (no olvide : @next
para nyc
)
npm install --save-dev nyc babel-plugin-istanbul babel-register
Agrega un env a babel
config:
{
"env": {
"nyc": { "plugins": ["istanbul"] }
}
}
nyc
config:
{
"reporter" : ["text", "text-summary", "lcov", "html"],
"include" : ["src/**/*.js"],
"require" : ["babel-register"],
"sourceMap" : false,
"instrument" : false,
"all" : true
}
PS: el campo de include
debe especificarse en .nycrc
de en package.json
, si se especifica en la línea de comandos, la cobertura no funcionará
Ejecutando las pruebas:
# 1. Build
NODE_ENV=nyc babel src --out-dir lib
# 2. Coverage
nyc mocha
Solución B: No hay paquetes extra: solo los básicos.
Se ha trabajado recientemente en Estambul ( 1.0.0-alpha.2 ) para admitir el código generado por Babel con sourcemaps (ver #212 y this para un ejemplo).
Hay 2 formas:
- A. Pruebas escritas contra código previamente transpilado.
- B. Pruebas escritas contra el código original y transpiladas todas juntas en memoria en tiempo de ejecución
B1. Pruebas que exporta (previamente) código transpilado.
Esto se hace en 2 pasos: Primero, genere su fuente con babel (por ejemplo, desde ./src a ./out) y escriba sus pruebas contra la fuente transpilada ( export foo from "./out/foo";
).
Entonces podrás ejecutar las pruebas usando istanbul 1.0.0-alpha.2 :
istanbul cover _mocha -- ./test --compilers js:babel-register
Ahora, si desea que la cobertura del código siga el código original que ha escrito (no el que está transpilado), asegúrese de compilar con las opciones de mapas de origen de babel configuradas para both :
babel ./src --out-dir ./out --source-maps both
PD: Si es necesario también puedes hacer:
istanbul cover _mocha -- ./test --compilers js:babel-register /
--require babel-polyfill /
--require should /
--require sinon
B2. Pruebas que exporta directamente código original.
En este caso, escribe tus pruebas contra la fuente original ( export foo from "./src/foo";
), y sin más pasos, ejecutas istanbul 1.0.0-alpha.2 usando babel-node contra cli.js:
babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
PD: Si es necesario también puedes hacer:
babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
--require babel-polyfill /
--require should /
--require sinon
A partir del 17.4.2016, este informe de cobertura sigue siendo un poco desordenado y con mi proyecto React que tiene archivos .jsx y un archivo de ayuda, el script de informes de cobertura tiene este aspecto:
istanbul cover node_modules/mocha/bin/_mocha -- /
--compilers js:babel-core/register /
--require ./test/testhelper.js /
/"test/**/*@(.js|.jsx)/"
Así que no sería tan fácil que la versión actual 0.4.3 de Estambul no funcione con Babel, por lo que tiene que usar la versión alfa experimental:
npm install [email protected] --save-dev
Y luego necesita el .istanbul.yml
.istanbul.yml para que Estambul reconozca los archivos .jsx con estas líneas:
instrumentation:
root: .
extensions: [''.js'', ''.jsx'']
Y ahora debería funcionar. También como un pequeño bono, si desea agregar informes de cobertura con Travis y Coveralls, debe:
- habilitar el proyecto en https://coveralls.io
- agregar overoles
npm i coveralls --save-dev
agrega esto a tu
.travis.yml
:script: - npm --silent test - cat ./c coverage/lcov.info | coveralls
Y ahora puedes poner esa insignia fresca a tu README. Neato!
Usando Babel 6.x, digamos que tenemos el archivo test/pad.spec.js
:
import pad from ''../src/assets/js/helpers/pad'';
import assert from ''assert'';
describe(''pad'', () => {
it(''should pad a string'', () => {
assert.equal(pad(''foo'', 4), ''0foo'');
});
});
Instala un montón de basura
$ npm install babel-istanbul babel-cli babel-preset-es2015 mocha
Crea un .babelrc
:
{
"presets": ["es2015"]
}
Ejecutar las pruebas:
$ node_modules/.bin/babel-node node_modules/.bin/babel-istanbul cover /
node_modules/.bin/_mocha -- test/pad.spec.js
pad
✓ should pad a string
1 passing (8ms)
=============================================================================
Writing coverage object [/Volumes/alien/projects/forked/react-flux-puzzle/coverage/coverage.json]
Writing coverage reports at [/Volumes/alien/projects/forked/react-flux-puzzle/coverage]
=============================================================================
=============================== Coverage summary ===============================
Statements : 100% ( 4/4 )
Branches : 66.67% ( 4/6 ), 1 ignored
Functions : 100% ( 1/1 )
Lines : 100% ( 3/3 )
================================================================================
ACTUALIZACIÓN : He tenido éxito usando nyc
(que consume a istanbul
) en lugar de istanbul
/ babel-istanbul
. Esto es algo menos complicado. Intentarlo:
Instalar cosas (puedes eliminar babel-istanbul
y babel-cli
):
$ npm install babel-core babel-preset-es2015 mocha nyc
Crea .babelrc
como arriba.
Ejecuta esto:
$ node_modules/.bin/nyc --require babel-core/register node_modules/.bin/mocha /
test/pad.spec.js
... lo que debería darte resultados similares. De forma predeterminada, coloca la información de cobertura en .nyc-output/
e imprime un buen resumen de texto en la consola.
Nota: puede eliminar node_modules/.bin/
de cualquiera de estos comandos al colocar el comando en el campo de scripts
package.json
.