nyc node.js mocha babeljs istanbul

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:

  1. habilitar el proyecto en https://coveralls.io
  2. agregar overoles npm i coveralls --save-dev
  3. 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 .