# たった1行のRubyのテストフレームワーク
_published: 2008/11/01_ 
たった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行だからいいんですよね。