v6.3.0以降のNode.jsでは --inspect
を指定することでChromeの開発ツールでデバッグできるようになっています1。--inspect-brk
を指定するとプログラムの先頭にブレークポイントが設定されます。ですが、Mochaのテストコードを開発ツールでデバッグしようとするとMochaのスタートアップルーチンで停止してしまうので、まだテストコードもテスト対象のプログラムもロードされておらず、デバッグしたい箇所にブレークポイントを設定することができません2。
このような場合、以下の操作でブレークポイントが設定できます。
REPLでテスト対象のプログラムにブレークポイントを設定する
- コマンドラインから
node --inspect
でREPLを起動し、開発ツールから参照します。(→手順) - 開発ツールの Console から
require()
でテスト対象のプログラムをロードします。 - 開発ツールの Sources からテスト対象のプログラムを選択し、適当な場所(コンストラクタが最適と思われる)にブレークポイントを設定します。
- 開発ツールを閉じ、コマンドラインから起動したREPLも終了させます。
テストプログラムを開発ツール内で走行させブレークポイントで停止させる
-
npm test -- --inspect-brk テストプログラム名
でテストプログラムを走行させ、開発ツールから参照します。 - Mochaのスタートアップルーチンで停止している状態なので、開発ツールのデバッガの再開ボタンを押下し、プログラムの走行を再開させます。
- テスト対象のプログラムの先ほど設定したブレークポイントでプログラムが停止するはずです。開発ツールがセッションをまたがってブレークポイントを覚えていてくれるのがミソです。
テストコードにブレークポイントを張る
- ここまでくれば、すでにテストコードもロードされた状態になっているはずなので、開発ツールの Sources からテストプログラムを選択し(かなりの数のプログラムがロードされるので探すのがちょっと面倒です)、デバッグしたい箇所にブレークポイントを設定すればOKです。
-
https://nodejs.org/en/docs/inspector/#command-line-options ↩
-
そもそもテストの失敗理由はアサーションで知るべきであり、テストコードをデバッガで参照するなど邪道なのですが、それでもデバッガで追いたくなる場合もあるものです。 ↩