最近は Babel で変換することを前提に ECMAScript 2015 (ECMAScript 6 と呼ばれていたもの) を書くことが多いです。テスト中に power-assert もよく使うのですが、この組み合わせにハマりどころがあったので、メモも兼ねて書いておきます。

インストール

Babel と power-assert の両方を使うために、 espower-babel を使います。

$ npm install -D espower-babel mocha power-assert

テストコード

テストコードを power-assert と ES2015 の機能を使って書いていきます。

// test.js

import assert from 'power-assert';

describe('number', () => {
    it('1 + 1 = 2', () => {
        assert(1 + 1 === 2);
    });
});

Arrow Function を使っています。

テストの実行

このテストコードを Mocha で実行していきます。 espower-babel を使うために --compilers js:espower-babel/guess というオプションを指定します。 今回は必要ないですが ES 2015 の Polyfill を使うためには、 babel をインストールしてオプションに --require babel/polyfill と加える必要があります。

$ mocha --compilers js:espower-babel/guess test.js

たったこれだけで・・・とはなりません。このコマンドを実行するとエラーが出ます。エラーメッセージをよく見ると test.js が babel で変換されていません。

この動作は espower-babel の仕様で、変換をするのは test ディレクトリの中のファイルだけになっているのが原因です。これを回避する方法はいくつかあります。

  1. テストコードはすべて test ディレクトリに入れる
  2. 自分で --compiler に渡すモジュールを作る
  3. package.jsondirectoriestest にそのファイルがあるディレクトリを指定する

自然と 1 を満たす場合も多いと思います。 2 は細かく制御できるのはメリットかも知れませんが面倒くさいです。 test ディレクトリ以外の場所にテストコードを起きたい場合は、 3 が一番簡単だと思います。

src ディレクトリの中にテストコードがある場合、次の用に指定します。

{
  "directories": {
      "test": "src"
  },
  ...
}

これで espower-babel がコードをきちんと変換してくれる用になります。

もし package.json と同じ階層にテストコードがある場合は "." と指定します。

babelrc

それ以外だと .babelrc ではまりました。 espower-babel は勝手に .babelrc を読み込むので "ignore": ["*.spec.js"] なんで書いてあると変換してくれなくなってしまいます。

自分はリリース用に babel を使っているときやってしまいました。

最後に

Babel も power-assert も便利なのでどんどん使っていきましょう。