web-dev-qa-db-fra.com

Courir Mocha + Istanbul + Babel

J'ai des problèmes lors de l'exécution d'istanbul avec mocha et le compilateur babel ..

tous mes tests fonctionnent très bien, mais après tous les tests effectués, il me montre ce message:

No coverage information was collected, exit without writing coverage information

Et il ne produit aucun rapport de couverture ..

La commande que j'exécute est:

NODE_ENV=test istanbul cover _mocha -- --require babel-core/register --recursive

le projet est hébergé dans github: https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24

des idées ce que cela pourrait être?

48
Weslley Araujo

En utilisant Babel 6.x, disons que nous avons le fichier 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');
  });
});

Installez un tas de merde:

$ npm install babel-istanbul babel-cli babel-preset-es2015 mocha

Créez un .babelrc:

{
  "presets": ["es2015"]
}

Exécutez les tests:

$ 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 )
================================================================================

UPDATE : J'ai réussi à utiliser nyc (qui consomme istanbul) au lieu de istanbul/babel-istanbul. C'est un peu moins compliqué. Pour l'essayer:

Installez des trucs (vous pouvez supprimer babel-istanbul Et babel-cli):

$ npm install babel-core babel-preset-es2015 mocha nyc

Créez .babelrc Comme ci-dessus.

Exécutez ceci:

$ node_modules/.bin/nyc --require babel-core/register node_modules/.bin/mocha \ 
test/pad.spec.js

... ce qui devrait vous donner des résultats similaires. Par défaut, il met les informations de couverture dans .nyc-output/, Et imprime un joli résumé de texte dans la console.

Remarque: Vous pouvez supprimer node_modules/.bin/ De n'importe laquelle de ces commandes lorsque vous placez la commande dans package.json Dans scripts.

62
boneskull


PS: je recommande maintenant d'utiliser une seule plaisanterie au lieu de mocha/instanbul/nyc/chai/etc .


Solution A: utiliser nyc et babel-plugin-istanbul

Installer (n'oubliez pas @next pour nyc):

npm install --save-dev nyc babel-plugin-istanbul babel-register

Ajoutez un env à 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
}

Le champ PS: include doit être spécifié dans .nycrc de en package.json, si spécifié en ligne de commande, la couverture ne fonctionnera pas

Exécution des tests:

# 1. Build
NODE_ENV=nyc babel src --out-dir lib

# 2. Coverage
nyc mocha

Solution B: pas de packages supplémentaires: uniquement les packages de base

Des travaux ont été effectués récemment sur istanbul ( 1.0.0-alpha.2 ) pour prendre en charge le code généré par Babel avec des sourcemaps (voir # 212 et this à titre d'exemple).

Il y a 2 façons:

  • A. Tests écrits contre du code précédemment transposé
  • B. Tests écrits par rapport au code d'origine et transposés tous ensemble en mémoire lors de l'exécution


B1. Tests qui exportent (précédemment) du code transpilé

Cela se fait en 2 étapes: Tout d'abord, créez votre source avec babel (par exemple de ./src à ./out) et écrivez vos tests par rapport à la source transpilée (export foo from "./out/foo";).

Ensuite, vous pourrez exécuter les tests en utilisant istanbul 1.0.0-alpha.2 :

istanbul cover _mocha -- ./test --compilers js:babel-register 

Maintenant, si vous voulez que la couverture du code suive le code d'origine que vous avez écrit (pas celui transpilé), assurez-vous de construire avec options babel source-maps défini sur both :

babel ./src --out-dir ./out --source-maps both

PS: Si nécessaire, vous pouvez également faire:

istanbul cover _mocha -- ./test --compilers js:babel-register \
   --require babel-polyfill \
   --require should \
   --require sinon


B2. Tests qui exportent directement le code d'origine

Dans ce cas, vous écrivez vos tests par rapport à la source d'origine (export foo from "./src/foo";), et sans autre étape, vous exécutez directement istanbul 1.0.0-alpha.2 en utilisant babel-node contre cli.js:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test

PS: Si nécessaire, vous pouvez également faire:

babel-node ./node_modules/istanbul/lib/cli.js cover _mocha -- ./test
   --require babel-polyfill \
   --require should \
   --require sinon
25
Yves M.

Depuis le 17.4.2016, ce rapport de couverture est encore un peu compliqué et avec mon projet React qui a des fichiers .jsx et un fichier d'aide, le script de rapport de couverture ressemble à ceci:

istanbul cover node_modules/mocha/bin/_mocha -- \
   --compilers js:babel-core/register \
   --require ./test/testhelper.js  \
   \"test/**/*@(.js|.jsx)\"

Il ne serait donc pas trop facile que la version actuelle 0.4.3 d'Istanbul ne fonctionne pas avec Babel, vous devez donc utiliser la version alpha expérimentale:

npm install [email protected] --save-dev

Et puis vous avez besoin de .istanbul.yml -fichier pour qu'Istanbul reconnaisse les fichiers .jsx avec ces lignes:

instrumentation:
  root: .
  extensions: ['.js', '.jsx']

Et maintenant ça devrait marcher. De plus, si vous souhaitez ajouter des rapports de couverture avec Travis et Coveralls, vous devez:

  1. activer le projet dans https://coveralls.io
  2. ajouter des combinaisons npm i coveralls --save-dev
  3. ajoutez ceci à votre .travis.yml:

    script:
      - npm --silent test
      - cat ./c
    coverage/lcov.info | coveralls
    

Et maintenant, vous pouvez mettre ce badge cool sur votre fichier README. Neato!

4
TeemuK