[Babel] Babel: mocha + power-assert + babel-register + babel-preset-power-assert で es6 で書いたテストを実行する

espower-babel が非推奨となったため。

何となく導入と使い方を理解して寝ておきたら、事情が変わった

こちらを読む。

以下のバージョンの話。

"devDependencies": {
  "babel-cli": "^6.7.5",
  "babel-preset-es2015": "^6.6.0",
  "babel-preset-power-assert": "^1.0.0",
  "babel-register": "^6.7.2",
  "mocha": "^2.4.5",
  "power-assert": "^1.3.1",

インストール

Babel は導入済みとする。
以下をテストのためにインストールする。

% npm install --save-dev mocha babel-register babel-preset-power-assert

使い方

.babelrc を作成する。

.babelrc
{
  "presets": [
    "es2015"
  ],
  "env": {
    "development": {
      "presets": [
        "power-assert"
      ]
    }
  }
}

require(‘assert’) を require(‘power-assert’) へ変更する。
require(‘assert’) のままで動く。

test/math.test.js
const assert = require('assert');
import * as Math from '../src/lib/math.es6.js';
// もしくは
// const Math = require('../src/lib/math.es6.js');
/** @test {Math} */
describe('Math', () => {
  /** @test {pi} */
  describe('pi', () => {
    it('円周率は 3.141593 である', () => {
      assert(Math.pi === 3.141593);
    });
  });
  /** @test {sum} */
  describe('sum', () => {
    it('1 + 2 の合計は 3 である', () => {
      assert(Math.sum(1, 2) === 3);
    });
  });
});

--compilers オプションを付けて実行する。
mocha.opts に書いても良いそうです。

% $(npm bin)/mocha --compilers js:babel-register test/**/*.test.js

以上で利用できる。

espower-babel 環境からの移行をサポートする migrate-espower-babel-to-babel-preset-power-assert

既存の環境から移行をサポートしてくれるパッケージがある。

% npm install -D migrate-espower-babel-to-babel-preset-power-assert
% $(npm bin)/migrate-espower-babel-to-babel-preset-power-assert
% npm uninstall -D migrate-espower-babel-to-babel-preset-power-assert

自分の場合は test/mocha.opts がなかったので、以下の内容で作成する必要があった。

test/mocha.opts
--compilers js:babel-register

サンプルコードと出力

サンプルのコード。

src/lib/math.es6.js
'use strict';
const assert = require('assert');
export function sum(x, y) {
  assert(typeof x === 'number');
  assert(typeof y === 'number');
  return x + y;
}

テストするコード。

src/lib/math.es6.js
const assert = require('assert');
import * as Math from '../src/lib/math.es6.js';
describe('Math', () => {
  describe('sum', () => {
    it('should return x + y', () => {
      const result = Math.sum(1, 2);
      assert(result === 3);
    });
    it('arguments should be type of number', () => {
      Math.sum('String1', 'String2');
    });
  });
});

"presets": ["power-assert"] あり。

  Math
    pi
      ✓ 円周率は 3.141593 である
    sum
      ✓ should return x + y
      1) arguments should be type of number
  Person
    ✓ #getAge
    ✓ #name
    ✓ #mistake
  5 passing (50ms)
  1 failing
  1) Math sum arguments should be type of number:
      AssertionError:   # src/lib/math.es6.js:14
  assert(typeof x === 'number')
         |        |
         "string" false
  --- [string] 'number'
  +++ [string] typeof x
  @@ -1,6 +1,6 @@
  -number
  +string
      + expected - actual
      -false
      +true

"presets": ["power-assert"] なし。

  Math
    pi
      ✓ 円周率は 3.141593 である
    sum
      ✓ should return x + y
      1) arguments should be type of number
  Person
    ✓ #getAge
    ✓ #name
    ✓ #mistake
  5 passing (24ms)
  1 failing
  1) Math sum arguments should be type of number:
      AssertionError: false == true
      + expected - actual
      -false
      +true

unassert

この状態だと、assert ライブラリも含まれた JavaScript が Build されてしまう。
具体的には、const assert = require('assert'); を含めて生成すると、JS が 17,000 行増える。
これは unassert を利用することで解決できた。

補遺