nycでbabel6のカバレッジを取る

[nyc](https://github.com/bcoe/nyc)は普段`npm test`で実行しているテストに、追従するようにして簡単にコードカバレッジを取ることが出来ます。

```json:package.json片
{
  "scripts": {
    "test": "mocha --compilers js:espower-babel/guess",
    "cover": "nyc --reporter=lcov --reporter=text npm run test"
  }
}
```

上記のような`cover`を実行すると、`lcov`レポータが`coverage/lcov.info`の生成を、`text`レポータがコンソール上の集計画面を出力します。

![スクリーンショット 2016-02-03 20.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/28576/087c6858-43d3-e794-9f4b-9d688b53f25d.png)

あなたが [isparta](https://github.com/douglasduteil/isparta) の代替手段を探している場合、必要なのは`npm install nyc --save-dev`と`cover`の追記だけではないでしょうか。

> [power-assert](http://efcl.info/2014/0406/res3809/)を使用しない場合は`test`は`mocha --require babel-register`としてみてください。

# nycの動作確認用の環境設定

前述のスクリーンショットでは、`src/index.js`にFooクラスのbazメソッドを定義し、`test/index.js`から`async/await`でテストを書くと言う内容で、コードカバレッジを取っています。

具体的には下記のような３ファイルです。

```bash:ディレクトリ構造の確認
tree .
# .
# ├── package.json
# ├── src
# │   └── index.js
# └── test
#     └── index.js
```

```json:package.json
{
  "name": "nyc-example",
  "scripts": {
    "test": "mocha --compilers js:espower-babel/guess",
    "cover": "nyc --reporter=lcov --reporter=text npm run test"
  },
  "devDependencies": {
    "babel-polyfill": "^6.3.14",
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-stage-2": "^6.3.13",
    "espower-babel": "^4.0.1",
    "mocha": "^2.4.5",
    "nyc": "^5.5.0",
    "power-assert": "^1.2.0"
  },
  "babel": {
    "presets": [
      "es2015",
      "stage-2"
    ]
  }
}
```

```js:src/index.js
export default class Foo {
  bar() {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve('baz');
      }, 0);
    });
  }
}
```

```js:test/index.js
import Foo from '../src';
import { equal } from 'power-assert';
import 'babel-polyfill';

describe('Fooクラス', () => {
  it('barメソッドは非同期にbazを返す', async () => {
    const foo = new Foo;
    equal(await foo.bar(), 'baz');
  });
});
```

テストで`async/await`を使わないのであれば、`babel-polyfill`は不要です。お好みで依存モジュールを付け替えしてみましょう。

# avaを使う

`power-assert`や`babel-polyfill`を内蔵している[テストランナーava](https://github.com/sindresorhus/ava-docs/tree/master/ja_JP#なぜavaなのか)であれば、`package.json`がもう少しシンプルになります。

```bash:ディレクトリ構造の確認
tree .
# .
# ├── package.json
# ├── src
# │   └── index.js
# └── test
#     └── index.js
```

```json:package.json
{
  "name": "nyc-example",
  "scripts": {
    "test": "ava --require babel-register",
    "cover": "nyc --reporter=lcov --reporter=text npm run test"
  },
  "devDependencies": {
    "ava": "^0.11.0",
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-stage-2": "^6.3.13",
    "babel-register": "^6.4.3",
    "nyc": "^5.5.0"
  },
  "babel": {
    "presets": [
      "es2015",
      "stage-2"
    ]
  }
}
```

```js:src/index.js
export default class Foo {
  bar() {
    return new Promise((resolve) => {
      setTimeout(() => {
        resolve('baz');
      }, 0);
    });
  }
}
```

```js:test/index.js
import Foo from '../src';
import test from 'ava';

test('barメソッドは非同期にbazを返す', async t => {
  const foo = new Foo;
  t.is(await foo.bar(), 'baz');
});
```

![スクリーンショット 2016-02-03 20.30.12.png](https://qiita-image-store.s3.amazonaws.com/0/28576/5e3726d0-aee4-6cfd-de01-55a2079a44dd.png)

# 成果物

[ava+nyc+travisCIを使ってnpmjsへライブラリを公開](https://www.npmjs.com/package/cyrano)したレポジトリがあるので、よければ参考にしてください。

* [59naga/cyrano - github](https://github.com/59naga/cyrano)