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

吉見和也(Kazuya Yoshimi) 2008-02-28 19:54:31

前回の続きで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編集部の見解・意向を示すものではありません。

SpecialPR

  • デジタル変革か?ゲームセットか?

    デジタルを駆使する破壊的なプレーヤーの出現、既存のビジネスモデルで競争力を持つプレイヤーはデジタル活用による変革が迫られている。これを読めばデジタル変革の全体像がわかる!

  • 「奉行シリーズ」の電話サポート革命!活用事例をご紹介

    「ナビダイヤル」の「トラフィックレポート」を利用したことで着信前のコール数や
    離脱数など、コールセンターのパフォーマンスをリアルタイムに把握するに成功。詳細はこちらから