web-dev-qa-db-ja.com

ランニングモカ+イスタンブール+バベル

Mochaとbabelコンパイラでistanbulを実行しているときに問題が発生します。

私のテストはすべて正常に実行されていますが、すべてのテストが完了した後、次のメッセージが表示されます。

No coverage information was collected, exit without writing coverage information

また、カバレッジレポートを作成していません。

Imが実行しているコマンドは次のとおりです。

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

プロジェクトはgithubでホストされています: https://github.com/weslleyaraujo/react-flux-puzzle/tree/feat/unit-tests-24

どんなアイデアがありますか?

48
Weslley Araujo

Babel 6.xを使用して、ファイル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');
  });
});

たくさんのがらくたをインストールする:

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

.babelrcを作成します。

{
  "presets": ["es2015"]
}

テストを実行します。

$ 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 [〜#〜]nyc /の代わりにistanbulistanbulを消費する)を使用して成功しましたbabel-istanbul。これはやや複雑ではありません。試すには:

ものをインストールします(babel-istanbulおよびbabel-cliを削除できます):

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

上記のように.babelrcを作成します。

これを実行します:

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

...同様の結果が得られます。デフォルトでは、カバレッジ情報を.nyc-output/に入れ、コンソールにNiceテキストの要約を出力します。

注:node_modules/.bin/scriptsフィールドにコマンドを配置する場合、これらのコマンドからpackage.jsonを削除できます。 。

62
boneskull


PS:mocha/instanbul/nyc/chai/etcの代わりに、単一の jest を使用することをお勧めします。


解決策A: nyc および babel-plugin-istanbul の使用

セットアップ nyc@nextを忘れないでください)

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

babel configにenvを追加します:

{
  "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:includeフィールドは、.nycrcpackage.jsonで指定する必要があります。コマンドラインで指定した場合、カバレッジは機能しません

テストの実行:

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

# 2. Coverage
nyc mocha

解決策B:追加パッケージなし:基本パッケージのみ

最近、イスタンブールで作業が行われました( 1.0.0-alpha.2 )。ソースマップを使用してBabelで生成されたコードをサポートします( #212 および this を参照)例)。

2つの方法があります。

  • A.以前にトランスコードされたコードに対して書かれたテスト
  • B.元のコードに対して作成され、実行時にすべてメモリにまとめてトランスポートされたテスト


B1。 (以前の)トランスコードされたコードをエクスポートするテスト

これは2つのステップで行われます。まず、ソースをbabelでビルドし(例えば、。/ srcから./outに)、テストされたソース(export foo from "./out/foo";)に対してテストを記述します。

その後、istanbul 1.0.0-alpha.2 を使用してテストを実行できます。

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

これで、コードカバレッジを(トランスコードされたコードではなく)作成した元のコードに従う場合は、 babel source-maps optionsboth に設定してビルドしてください:

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

PS:必要に応じて、次のこともできます。

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


B2。元のコードを直接エクスポートするテスト

この場合、元のソース(export foo from "./src/foo";)に対してテストを記述し、それ以上の手順を行わずに、直接istanbul 1.0.0-alpha.2 を使用してcli.jsに対してbabel-nodeを実行します:

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

PS:必要に応じて、次のこともできます。

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

現在17.4.2016の時点で、このカバレッジレポートはいささか厄介であり、.jsxファイルとヘルパーファイルを持つReactプロジェクトでは、カバレッジレポートスクリプトは次のようになります。

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

したがって、イスタンブールの現在のバージョン0.4.3はBabelで動作しないため、実験的なアルファバージョンを使用する必要があります。

npm install [email protected] --save-dev

次に、.istanbul.yml -fileが必要です。これにより、Istanbulはこれらの行で.jsxファイルを認識します。

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

そして今、それは動作するはずです。また、TravisとCoverallsのカバレッジレポートを追加する場合の小さなボーナスとして、次のことを行う必要があります。

  1. https://coveralls.io でプロジェクトを有効にします
  2. カバーオールを追加npm i coveralls --save-dev
  3. これを.travis.ymlに追加します:

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

そして今、あなたはあなたのREADMEにそのクールなバッジを置くことができます。ネイト!

4
TeemuK