小さなコマンドをtest-unitでテストする

Railsアプリケーションを開発していると、ちょっとした確認用だとか、ちょっとした管理作業だとかのために小さなコマンドを作ることがある。

この手の「小さなコマンド」は、その内部から他の複数のコマンドを呼び出していて、実際の仕事はそれらのツール類にやらせているということが少なくない。純粋にRubyで書いた場合にはいつも通りにテストを書けばよいのだが、こういったケースではテストを書くのが意外とめんどうだったりする。

なぜかというと、それらの内部から呼び出されるコマンド類がちょうどよい挙動をするようにデータを作るのが簡単にはいかないことがあるからだ。

ならば内部から呼び出されるコマンドをすべてスタブで置き換えてしまえばよいではないかと考え、ちょっとしたテストヘルパーを作ってみた。

テストしたい「小さなコマンド」を起動する際に、環境変数PATHを何もないディレクトリに向けてしまうことで、内部から本物のコマンドが呼びされないようにする。その上で、呼びさ出されるべきコマンドをスタブとして用意しておき、用意したスタブが期待通りに呼びさ出されることを検査する。

以上により、「小さなコマンド」についてもいつも通りにテストを書けるようになる。

最初は「小さなコマンド」のテストのためにちょっとしたヘルパーモジュールを作るだけのつもりだったのだが、意外にめんどうでどんどん行数が増えてしまった。

ちょっとしたことでも複数プロセスがからむと注意しなければならない点がずんと増えるなと改めて認識した。でもこういった部分をいちいち確認していくのは、やっぱりなかなか面白い。