RSpecチュートリアルやってみる その2

2008年02月28日 19:54
トラックバック (0)   コメント (0)

前回の続きで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は怒られまくりですね。
これをただ通してあげればいいやと思ってたんですが、チュートリアルの方ではなんかいろいろやってますね。一つ一つ確認していきたいけど、ここらで時間切れなので、また次回に

押忍

最新エントリー
カテゴリ
月別のアーカイブ
プロフィール
吉見和也(Kazuya Yoshimi)
RAWHIDE.(ローハイド.)取締役兼最高技術責任者。Rubyで開発する心地よさに惚れ、Ruby道を邁進する日々。迷わず行けよ、行けばわかるさ、Ruby道。押忍!
Powered by
 

企画特集

APC SOLUTIONS FORUM 2008をレポートAPC SOLUTIONS FORUM 2008をレポート
電源、冷却の効率化によるエネルギー削減とは?
DELLが掲げる「新・仮想化アセスメントサービス」DELLが掲げる「新・仮想化アセスメントサービス」
〜企業システムの仮想化環境の構築を支援〜
セキュリティ対策レベルテスト公開!セキュリティ対策レベルテスト公開!
自社のセキュリティのウイークポイントはドコ?
ZDNet Japan Green ITZDNet Japan Green IT
サミットだけでは終わらせない!エンタープライズの取り組みはこれからだ!
仮想化環境で求められるストレージの要件仮想化環境で求められるストレージの要件
それに応えるNetAppの実力とは?
ZDNet Japan ホスティング特集ZDNet Japan ホスティング特集
2008年夏のホスティングサービスのトレンドは何?
Webセキュリティ特集Webセキュリティ特集
Web2.0時代の脅威へ対抗するためのソリューションとは?
Techno ExchangeTechno Exchange
仮想化技術がグリーンITにもたらすもの
PRADA Phone開封の儀--iPhoneと比べてみました
NTTドコモから発売されている「PRADA Phone by LG」を編集部が入手した。同じタッチパネルケータイであるiPhoneとはどう違うのか、比べながら箱を開けてみた。
iPhoneとPRADA Phone、入力インターフェースはどう違うか
この夏に発売された、注目のタッチパネルケータイ「iPhone 3G」と「PRADA Phone by LG」。いずれもタッチパネルの入力方法にさまざまな工夫を凝らしている。
毎日新聞社内で何が起きているのか(上)
電凸が引き起こしたすさまじい破壊力 毎日新聞の英語版サイト「毎日デイリーニューズ」が女性蔑視の低...