アカベコマイリ

HEAR NOTHING SEE NOTHING SAY NOTHING

power-assert を import する時の注意点

小ネタ。

前に ES6 コードをテストする という記事を書いてから power-assertespower-babel を利用していた。これらを使うとテスト対象とテストの両方を ES6 で記述できて便利である。

しかし最近、テストが Fail な時に power-assert の特徴である詳細なエラー表示にならず標準 assert のような出力になってしまい、地味に困っていた。

そこで原因を調べたところ、前に記事を書いたときは power-assert の import

import assert from 'power-assert';

のようにしていたが標準 assert になってしまう。テスト コードでは

import Assert from 'power-assert';

のように assert を PascalCase で Assert としていることがわかった。これを assert に修正して実行すると、従来どおり詳細なエラー表示が復活。比較を分かりやすくするため、以下の Fail になるテストを実行してみる。

import assert from 'power-assert';
import Assert from 'power-assert';

describe( 'power-assert import', () => {
  it( 'assert', () => {
    assert( 'a' === 'b' );
  } );

  it( 'Assert', () => {
    Assert( 'a' === 'b' );
  } );
} );

出力は以下のようになった。

$ npm test

> electron-audio-player@1.0.0 test .../sample
> mocha --compilers js:espower-babel/guess test/**/*.test.js

  power-assert import
    1) assert
    2) Assert

  0 passing (44ms)
  2 failing

  1) power-assert import assert:

      AssertionError:   # test/Sample.test.js:6

  assert('a' === 'b')
             |
             false

  --- [string] 'b'
  +++ [string] 'a'
  @@ -1 +1 @@
  -b
  +a

      + expected - actual

      -false
      +true

      at decoratedAssert (node_modules/empower/lib/decorate.js:42:30)
      at powerAssert (node_modules/empower/index.js:58:32)
      at Context.<anonymous> (test/Sample.test.js:6:5)

  2) power-assert import Assert:

      AssertionError: false == true
      + expected - actual

      -false
      +true

      at decoratedAssert (node_modules/empower/lib/decorate.js:44:25)
      at powerAssert (node_modules/empower/index.js:58:32)
      at Context.<anonymous> (test/Sample.test.js:10:5)

npm ERR! Test failed.  See above for more details.

assert のほうは詳細な情報が出力されている。しかし Assert では標準 assert と同じく情報量が少ないことが分かる。

ところで冒頭に「最近」と書いた。前からこの書き方をしていたので、もっと早く気づいてもよさそうなものだ。しかしテストで Fail に遭遇する機会が少なく Fail になった時もすぐに原因が判明して修正していたので、違和感はあっても放置してしまった。

それと ES6 の import でブラケットを使用しないなら変数は export 対象へのエイリアスとして機能すると認識していた。そのためから名前の違いが動作に影響する考にはいたらず。この問題が起きても標準 assert としては動作するため power-assert の一時的な出力のバグ (いつか直るもの) と勘違いもしていた。

ちなみに import 先の変数を PascalCase にしている理由は単なる好みである。import はファイルの先頭に書かれて広範囲に参照されるため PascalCase にしておくと camelCase なローカル変数と区別しやすくなる。

今回の問題を踏まえて書き方を改めるべきか迷ったけれど、これは稀なケースだと思うので基本は現状維持するつもり。

Comments from WordPress

  • mysticatea mysticatea 2015-10-15T12:49:51Z

    Customization API を使うと PascalCase も使えると推測します。やったことはないですけど....

    https://github.com/power-assert-js/power-assert#customization-api

  • アカベコ アカベコ 2015-10-15T13:21:22Z

    情報提供ありがとうございます。

    その機能には気付きませんでした。patterns とかで変更するのでかね。
    この機能、別の用途でも役立ちそうな気がするので説明を読んでみます。

    ただし「power-assert と espower-babel を組み合わて package.json 以外に特別な設定をすることなくテストと対象を自然 ES6 で書く」という贅沢な目標があって、それを達成するためにはオプションなどは避けたいところです。

    そういえば mysticatea さんの npm-run-all と cpx も、package.json のみでプロジェクト運用するうえで非常に役立っています。ユニット テストについても、こういう感じで設定系を他のファイルに出さずに済ませたいなぁと思っています。