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?
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
.
PS: je recommande maintenant d'utiliser une seule plaisanterie au lieu de mocha/instanbul/nyc/chai/etc .
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
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:
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
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
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:
npm i coveralls --save-dev
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!