こういう説明の仕方はどうだろうか。ワークショップぽくやるときには、箇条書の部分を参加者に考えてもらったり。
仕様なんてのは、だいたい箇条書だったりする。例えば、FIFOなキューの仕様を考えてみよう。
- キューが空のとき
- 空だってわかること
- 長さは0を返すこと
- 先頭から取り出すそうとするとnilを返すこと
- キューに何個かはいってるとき
- 空じゃないってわかること
- 長さは要素の個数を返すこと
- 先頭から取り出そうとすると最初につっこんだやつが返ってくること
すんごい適当だが、こんな感じだろうか。んで、これをもとにテストをつくる。Rubyの標準ライブラリにQueueって名前のクラスがあるんで、かぶるのは微妙だから適当にArrayQueue(荒井注)とでも名前をつけとく。
んで、これが素直にテストに繋がってくのが、rspecの良さなんですよ!! きっと。
context 'キューが空のとき' do
setup do
@q = ArrayQueue.new
end
specify '空だってわかること' do
@q.should_be_empty
end
specify '長さは0を返すこと' do
@q.size.should_be 0
end
specify '先頭から取り出すそうとするとnilを返すこと' do
@q.deq.should_be_nil
end
end
context 'キューに何個かはいってるとき' do
setup do
@q = ArrayQueue.new
@q.enq(:one)
@q.enq(:two)
@q.enq(:three)
end
specify '空じゃないってわかること' do
@q.should_not_be_empty
end
specify '長さは要素の個数を返すこと' do
@q.size.should_be 3
end
specify '先頭から取り出そうとすると最初につっこんだやつが返ってくること' do
@q.deq.should_eql :one
end
end
実行するとこんなかんじ
キューが空のとき - 空だってわかること (ERROR - 1) - 長さは0を返すこと (ERROR - 2) - 先頭から取り出すそうとするとnilを返すこと (ERROR - 3) キューに何個かはいってるとき - 空じゃないってわかること (ERROR - 4) - 長さは要素の個数を返すこと (ERROR - 5) - 先頭から取り出そうとすると最初につっこんだやつが返ってくること (ERROR - 6) 1) NameError in 'キューが空のとき 空だってわかること' uninitialized constant ArrayQueue ./tmp.rb:24: 2) NameError in 'キューが空のとき 長さは0を返すこと' uninitialized constant ArrayQueue ./tmp.rb:24: 3) NameError in 'キューが空のとき 先頭から取り出すそうとするとnilを返すこと' uninitialized constant ArrayQueue ./tmp.rb:24: 4) NameError in 'キューに何個かはいってるとき 空じゃないってわかること' uninitialized constant ArrayQueue ./tmp.rb:39: 5) NameError in 'キューに何個かはいってるとき 長さは要素の個数を返すこと' uninitialized constant ArrayQueue ./tmp.rb:39: 6) NameError in 'キューに何個かはいってるとき 先頭から取り出そうとすると最初につっこんだやつが返ってくること' uninitialized constant ArrayQueue ./tmp.rb:39: Finished in 0.006 seconds 6 specifications, 6 failures

荒井注いい。
これから説明するときはそれを使います。
ちなみに
@q.empty?.should_be true
@q.empty?.should_not_be true
は
@q.should_be_empty
@q.should_not_be_empty
と書くのがだんだん気持ちよくなります。あふ。
おっす、あとでなおすっす