前回の続きでRSpecのチュートリアルをやってきます。
前回はただ単に、古いrspecの書き方から新しいrspecの書き方に変えただけで、後はなぞっただけでした。何実装してんのかは気にしなかったので、今回はそれぞれの意味を見て行きます。
今実装されているspecはこちら
describe "An all white code with an all white guess" do before do all_white_code = Mastermind::Code.new(:white, :white, :white, :white) all_white_guess = Mastermind::Code.new(:white, :white, :white, :white) @score = all_white_code.mark(all_white_guess) end it "should score 4 black pegs" do @score.black.should == 4 end end
これは一つの仕様を表してるんだけど、はっきり言ってなにがなんだかわからない。これを分かりやすくしてみる。
describe "全てのピンが白で、予想も全て白の時" do before do all_white_code = Mastermind::Code.new(:white, :white, :white, :white) all_white_guess = Mastermind::Code.new(:white, :white, :white, :white) @score = all_white_code.mark(all_white_guess) end it "Score#black(場所も色も合ってる数)の値は4" do @score.black.should == 4 end end
日本語で書き直しただけ。ここではScore#blackってメソッドがあって、場所も色もあってる正解のピンが4つのうちいくつあるかを返してくれる模様。ややこしいけど、日本語で仕様を書き直したら、少しはましになった。ピン4本とも白のところに、白4本と予想したんだから、Score#blackの結果は4ですよ、っていうこと
ただしここでは、Score#blackが4を返すことしか決まってないんだから、直接4を返すようにしただけ。
ちなみに僕は英語苦手なんで、勘違いしてる部分があったら指摘してやってくださいね
そしたら次のフェーズ、The Second Specification
specs/all_white_code_spec.rb it "Score#white(色は合ってるけど場所が違う数)の結果は0" do @score.white.should == 0 end
で、Score#whiteがないよって怒られるのを確認してから実装してあげる。ここでもただ0を返せばいい。
lib/score.rb def white end
■
specs/all_white_code_spec.rb it "予想が全部あたってる場合は勝ち" do @score.should be_win end
lib/score.rb def win? true end
Score#win?がtrueになることを期待されてるんだから、何も考えずにtrueを返してあげる。
これがプログラミングと言えるのか!?
これじゃあ悲しすぎるからかはわからないけど、次は一旦ここまでのものを整理
Scoreのコンストラクタを見てみると、black,whiteの二つの引数を受け取ってる。Score#blackとScore#whiteはその引数でわたってきたものをそのまま返したいだけみたい。
なので、そーゆー風にリファクタリング。
src/score.rb module Mastermind class Score def initialize(black, white) @black = black @white = white end def black @black end def white @white end def win? true end end end
なるほど、テスト駆動開発のドキュメントにある、仕様>実装>リファクタリングが一つのイテレーションっていうのはこうゆうことなのね。
そして、次からは新たなspecファイルを作成して、「全てのピンが白で、予想も全て白の時」とは違った状況について仕様を書いて行く。ファイル同じでもいいじゃんって思ったけど、とりあえずはチュートリアルに従って、新しく作りました
spec/all_white_code_with_all_black_guess_spec.rb require File.dirname(__FILE__) + '/../mastermind' describe "全てのピンが白だけど、全てのピンが黒だと予想した時" do before do all_white_code = Mastermind::Code.new(:white, :white, :white, :white) all_black_guess = Mastermind::Code.new(:black, :black, :black, :black) @score = all_white_code.mark(all_black_guess) end it "正解の数は0" do @score.black.should == 0 end it "色のみ正解の数は0" do @score.white.should == 0 end it "全部外したんだから勝ちではないよ" do @score.should_not be_win end end
さっきまで、どんな条件が来ようと固定の値を返してたScoreは怒られまくりですね。
これをただ通してあげればいいやと思ってたんですが、チュートリアルの方ではなんかいろいろやってますね。一つ一つ確認していきたいけど、ここらで時間切れなので、また次回に
押忍
※このエントリはZDNETブロガーにより投稿されたものです。朝日インタラクティブ および ZDNET編集部の見解・意向を示すものではありません。