# たった1行のRubyのテストフレームワーク _published: 2008/11/01_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20081101/1225540161) たった1行で、Rubyのテストフレームワークを作ってしまいます。元ネタはこちら。 - [PaulBarry.com - A Ruby Test Framework in One Line](http://paulbarry.com/articles/2008/05/23/a-ruby-test-framework-in-one-line) 任意の数の引数をとって、引数の値を合計するsumメソッドを作ります。まずは、テストファースト。TDD。 ```ruby tests = { "sum" => 0, "sum(7)" => 7, "sum(2, 3)" => 5, "sum(2, 3, 5)" => 10 } ``` テストはハッシュで定義します。キーがテストコードで、値が期待する結果です。 実装します。 ```ruby def sum(*args) (args || 0).inject(0){|s,e| s+e} end ``` `(args || 0)` は、引数にnilを渡された時を想定しています。この仕様はテストケースにないので、ビミョウですね。実装については、コメント欄でも話があがっていますが、本題ではないのでスルー。 そして、1行のテストフレームワーク。 ```ruby tests.each{|e,v| puts((r=eval(e))==v ? ". #{e}" : "! #{e} was '#{r}', expected '#{v}'")} ``` 実行結果。 ```ruby . sum . sum(2, 3, 5) . sum(7) . sum(2, 3) ``` テストコードがハッシュなので、実行順序は維持されません。 テストに失敗した時の例。 ```ruby . sum . sum(2, 3, 5) . sum(7) ! sum(2, 3) was '5', expected '8' ``` コメント欄では、20行でもっとシッカリしたテストが投稿されています。でも、1行だからいいんですよね。