RSpec面白い

前回はProgramming First Developmentがすげーって書きましたが、家で趣味のプログラム書く場合はテストフレームワークRSpecを使ってテスト駆動開発を試しています。


RSpecとかTDDとかのちゃんとした説明はこのへん。
 Rubyst Magazine
  スはスペックのス (1)
  スはスペックのス (2)
 第25回 Ruby/Rails勉強会@関西 - 角谷HTML化計画


なんというか、これ良いねー。RSpec使って最初に感じる快適さって、
 1. assertではなくshouldで表現する
 2. テスト名に日本語が使える
の2点かなあ。


xUnitで使われるassertと、RSpecのshouldの違いって、表現的には「f(x)はyだよ、絶対」と「f(x)はyになるべき」の違いでしかないんだけど、なぜかshouldの方がずっとピンとくる。まあ中学校で習う単語ってのもあるかな。
仕事でも、外国人エンジニアなんかとカタコト英語同士で会話するときとかに、「この設計はこうするべきです」とか「そのバグはあなたが直すべきです、ゴルア」なんて会話でshouldを多用するよね。


そんなわけでshould大好き。should使うべき。


テスト名を文字列リテラルで表現するのもちょっとした工夫だけど、心置きなく日本語が使えるという安心感がある。


describe Students, "もしね、例えばの話だよ、万が一生徒全員の名前が鈴木だったらどうよ" do
 it "そりゃあやっぱり整列したら学籍番号順に並ぶべきだろ、常識的に考えて" do


とかね。


今日書いてみたのはこんなやつ。
テストコード test_horoscope.rb

require 'horoscope'

describe Horoscope, "のテストがんばるよー" do
  it "限界値はうまくいってるかなドキドキ" do
    h = Horoscope.new
    h.calc(Date.new(2000,  3, 22)).should == "牡羊座"
    h.calc(Date.new(2000,  4, 19)).should == "牡羊座"
    h.calc(Date.new(2000,  4, 20)).should == "牡牛座"
    h.calc(Date.new(2000,  5, 20)).should == "牡牛座"
    h.calc(Date.new(2000,  5, 21)).should == "双子座"
    h.calc(Date.new(2000,  6, 21)).should == "双子座"
    h.calc(Date.new(2000,  6, 22)).should == "蟹座"
    h.calc(Date.new(2000,  7, 22)).should == "蟹座"
    h.calc(Date.new(2000,  7, 23)).should == "獅子座"
    h.calc(Date.new(2000,  8, 22)).should == "獅子座"
    h.calc(Date.new(2000,  8, 23)).should == "乙女座"
    h.calc(Date.new(2000,  9, 22)).should == "乙女座"
    h.calc(Date.new(2000,  9, 23)).should == "天秤座"
    h.calc(Date.new(2000, 10, 23)).should == "天秤座"
    h.calc(Date.new(2000, 10, 24)).should == "蠍座"
    h.calc(Date.new(2000, 11, 21)).should == "蠍座"
    h.calc(Date.new(2000, 11, 22)).should == "射手座"
    h.calc(Date.new(2000, 12, 21)).should == "射手座"
    h.calc(Date.new(2000, 12, 22)).should == "山羊座"
    h.calc(Date.new(2000,  1, 19)).should == "山羊座"
    h.calc(Date.new(2000,  1, 20)).should == "水瓶座"
    h.calc(Date.new(2000,  2, 18)).should == "水瓶座"
    h.calc(Date.new(2000,  2, 19)).should == "魚座"
    h.calc(Date.new(2000,  3, 20)).should == "魚座"
  end
end


本体 horoscope.rb

class Horoscope
  def calc(date)
    mmdd = date.month * 100 + date.day
    if mmdd <= 119
      horo = "山羊座"
    elsif mmdd <= 218
      horo = "水瓶座"
    elsif mmdd <= 320
      horo = "魚座"
    elsif mmdd <= 419
      horo = "牡羊座"
    elsif mmdd <= 520
      horo = "牡牛座"
    elsif mmdd <= 621
      horo = "双子座"
    elsif mmdd <= 722
      horo = "蟹座"
    elsif mmdd <= 822
      horo = "獅子座"
    elsif mmdd <= 922
      horo = "乙女座"
    elsif mmdd <= 1023
      horo = "天秤座"
    elsif mmdd <= 1121
      horo = "蠍座"
    elsif mmdd <= 1221
      horo = "射手座"
    else
      horo = "山羊座"
    end
    horo
  end
end


これを実行するとこんな感じ。

$ spec -cfs test_horoscope.rb 

Horoscope のテストがんばるよー
- 限界値はうまくいってるかなドキドキ

Finished in 0.010572 seconds

1 example, 0 failures
$ 

0 failures、やたー。


機能はいっぱいあるみたいだけど、少しずつ使っていこう。