前回の続きで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 0 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は怒られまくりですね。
これをただ通してあげればいいやと思ってたんですが、チュートリアルの方ではなんかいろいろやってますね。一つ一つ確認していきたいけど、ここらで時間切れなので、また次回に
押忍
APC SOLUTIONS FORUM 2008をレポート
DELLが掲げる「新・仮想化アセスメントサービス」
セキュリティ対策レベルテスト公開!
ZDNet Japan Green IT
仮想化環境で求められるストレージの要件
ZDNet Japan ホスティング特集
Webセキュリティ特集
Techno Exchange
PRADA Phone開封の儀--iPhoneと比べてみました
iPhoneとPRADA Phone、入力インターフェースはどう違うか
毎日新聞社内で何が起きているのか(上)