ようやくですが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
というわけで失敗します。なお、実際にはこんな感じに色がついてます。
と、ここで今まで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
無事グリーンになりました。本日はこれにて。