kenju's blog

About Programming, Mathematics, Security and Blockchain

mocha でテストを実行するときに役立つデバッグ手法

mocha でテストしていた時に便利だったTipsのまとめ。 現状進行形で使っている。

Debugger API (Node.js) を使う

Node.js 本体の提供するデバッガーを使うと、binding.pry みたいなデバッグができます。 mocha も Node.js のランタイムで実行されるので、当然 Debugger APIが使用できます。

stackoverflow.com

$ $(npm bin)/mocha \
  debug \ # Here!
  --opts spec/client/support/default.opts \
  spec

Steppingは以下を参考。標準で c とか s とか一文字のaliasが対応づけられているので便利。

Debugger | Node.js v8.2.1 Documentation

テストしたい箇所で debugger を仕込む。binding.pry と一緒。

// spec_***.js
...
debugger; // debugger starts here
...

Pryと違ってデバッガー立ち上げ時にREPLが起動しているわけではないので注意。 repl と入力すると、REPLモードが起動します。 そのスコープで定義してある変数とかごにょごにょしたい時に便利。

特定のファイルの特定の箇所をテストする

あるコンポーネントの単体スペックファイルを実装しているとき、そのファイルの特定のdescribe句を実行したい時は、mocha --grep "pattern" オプションが便利。これは rspec [file] -e "pattern" と似ています。

$ $(npm bin)/mocha \
  --opts spec/client/support/default.opts \
  spec/client/components/some_component.spec.jsx \
  -g "EVENT_SAVE" # Here!

追記:

only() を使うともっと便利でした。

describe('Array', function() {
  describe.only('#indexOf()', function() {
    // ...
  });
});

ファイルの変更をwatchする

以下のように --watch オプションを加えると、変更があるたびにテストを実行してくれる。

$ $(npm bin)/mocha --opts spec/client/support/default.opts --watch spec/client/components/some_component.spec.jsx -g "EVENT_SAVE"

なお、この時 --reporter min にするのがオススメ。

注意点としては、mocha は babel のトランスパイルを挟んでいて、--requireだとうまくwatchしてくれない(ファイルが変更してもトランスパイルが走らないので、mochaがwatchしているトランスパイル済みのファイルに変更はない = テストが再実行されない)

これを修正するには、以下のように変更します:

- --require babel-core/register
+ --compilers js:babel-core/register,jsx:babel-core/register