ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

ようやくですがTDDをやってみたいと思います。

あれからだいぶたちましたが、かんたんなTDDをやってみたいと思います。この前はいきなりRailsでやろうと思って途方に暮れたので、さくっとやります、さくっと!

今回はRubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)を参考に、RSpecを使った簡単なテストを書いてみました。やりたいやりたいと言っているだけでは始まりませんので、やります。

準備

$ gem install rspec 
Successfully installed rspec-2.11.0
1 gem installed
Installing ri documentation for rspec-2.11.0...
Installing RDoc documentation for rspec-2.11.0...
$ rspec  -v
2.11.1

仕様のようなもの

今回は上記のページにあったとおりにArrayクラスのテストをします。要は写経ですね。ざっと読む限り、Arrayクラスのインスタンスが空のときの挙動、Arrayクラスを初期化するときの挙動をテストするみたいです。

というわけでやってみる

執筆当時とRSpecのバージョンが異なるので、コマンドや出力結果が違うところが多々あります。

テストを書く

まずはspecファイルというものを用意します。中身はこう。

describe Array, "when empty" do
  #初期化?
  before do
    @empty_array = []
  end

  #ここからが本題らしい
  it "should be empty" do
    @empty_array.should be_empty
  end

  it "should size 0" do
    @empty_array.size.should == 0
  end
  #ここまでが本題らしい

  #後片付け
  after do
    @empty_array = nil
  end
end

テストの実行

こんな感じに実行するようです。

$ rspec array_spec.rb 
..

Finished in 0.00238 seconds
2 examples, 0 failures

Arrayクラスは頻繁に使われる組み込みクラスですし、当然のごとくグリーンです。
なお -c というオプションをつけると色をつけて表示してくれるようです。

わざと間違えてみよう

今度はさっきのspecファイルをこんな感じに書き換えてみます。

describe Array, "when initialized with object" do
  before do
    @array = Array.new(3, Hash.new) # ←これが間違ってる
    @array[0][:cat] = "(=^・^=)"
  end

  it "should not affect others" do
    @array.should == [{:cat => "(=^・^=)"}, {}, {}]
  end
end

今度は初期化するときの挙動です。このやり方で初期化したこと今までなかったんですけど
で、実行してみると…

$ rspec array_spec.rb -c
F

Failures:

  1) Array when initialized with object should not affect others
     Failure/Error: @array.should == [{:cat => "(=^^=)"}, {}, {}]
       expected: [{:cat=>"(=^^=)"}, {}, {}]
            got: [{:cat=>"(=^^=)"}, {:cat=>"(=^^=)"}, {:cat=>"(=^^=)"}] (using ==)
       Diff:
       @@ -1,2 +1,2 @@
       -[{:cat=>"(=^^=)"}, {}, {}]
       +[{:cat=>"(=^^=)"}, {:cat=>"(=^^=)"}, {:cat=>"(=^^=)"}]
     # ./array_spec.rb:28:in `block (2 levels) in <top (required)>'

Finished in 0.00106 seconds
1 example, 1 failure

Failed examples:

rspec ./array_spec.rb:27 # Array when initialized with object should not affect others

というわけで失敗します。なお、実際にはこんな感じに色がついてます。
f:id:yuu_xxxx:20121006231223p:plain
と、ここで今までdescribeやitのあとにつけていた文字列が出てきましたね。

  1) Array when initialized with object should not affect others

ここです。これは「1番目のテストが失敗したよ」という意味らしいです。そこから下は

  • 失敗した評価式
  • 期待される値
  • 得られた値
  • 上2つの差分(Diff:から+[{:cat〜で始まる行まで)
  • 評価に失敗した場所

という感じみたいですね。
ところでこの1行目の文言、渡した文字列が連結されたものということは日本語でもいけるみたいですね。書き換えてみましょう。

#1行目
describe Array, "Arrayをオブジェクトで初期化したとき" do
#7行目
  it "他のメンバーには影響はない" do

で、実行します

$ rspec array_spec.rb -c
F

Failures:

  1) Array Arrayをオブジェクトで初期化したとき 他のメンバーには影響はない
     Failure/Error: @array.should == [{:cat => "(=^^=)"}, {}, {}]

おお、ちゃんと変わった。

ではグリーンにしてみる

今日はこのテストをグリーンにして終わりにしましょう。正解はすぐ下の方に書いてあるので丸パクリ参考にします。

#3行目
    @array = Array.new(3){ Hash.new } #←正解!

と書き換えて実行してみます。

$ rspec array_spec.rb -c
.

Finished in 0.00038 seconds
1 example, 0 failures

無事グリーンになりました。本日はこれにて。