irbで実行した内容を簡単にユニットテストにする。
Gauche でテスト作成支援 gca.el - higepon blogを見て、Rubyっ子だったらやっぱりirbでやりたいなぁと思って試してみました。
irbで評価した内容とその返り値がTest::Unitのassertの形式でクリップボードにコピーします(Windows限定。gemでwin32-clipboardを入れておいてください)。適宜エディタにフォーカスを合わせてペーストしてあげれば簡単にユニットテストが書けます。
ファイル: unit.rb
require 'win32/clipboard' module IRB class Context alias __evaluate__ evaluate def evaluate(line, line_no) __evaluate__(line, line_no) Win32::Clipboard.set_data( "assert_equal(#{last_value.inspect}, #{line.chomp})") end end end
実行例:
$ irb -rubygems -r unit irb(main):001:0> 'hoge'.succ => "hogf" => ここで「assert_equal("hogf", 'hoge'.succ)」が クリップボードにコピーされています。 irb(main):002:0> [1, 2, 3].map {|n| n * 2 } => [2, 4, 6] => ここで「assert_equal([2, 4, 6], [1, 2, 3].map {|n| n * 2 })」が クリップボードにコピーされています。
実装は、irbが入力を評価しているところにフックいれているだけです。クイックハック万歳。動的言語万歳。
あと試していないのですが、たぶん.irbrcあたりにunit.rbの内容を書いても動くと思います。それから今回はWindowsのクリップボードを使ったのですが、適宜ファイルに落とすなり改造するといろんな環境で動かせて幸せかも。あ、それから、今回はassert_equalしか使っていませんが、last_valueの内容によってassertファミリーを使い分けるようにしても面白いと思います。例外のテストも例外をわざと発生させてそれをrescueして、もう一度投げ直せばできそうな気がします(未確認)。