ユーザ用ツール

サイト用ツール


rspec

RSpec

RSpec は Ruby 用のユニットテストフレームワーク。テスト(ビヘイビア)駆動開発を行うためのツール。テストケースをオブジェクトの仕様として記述することに重点を置いている。

インストール

$ gem install rspec

実行

RSpec 1

$ spec -c -fs ディレクトリorファイル

RSpec 2 でコマンドが変わった

$ rspec -c -fs ディレクトリorファイル

cオプションは色付け、fsオプションは仕様書風味の結果出力、実装が上手くいっているものが列挙されるので見てて楽しい。

$ rspec -l 83 

とすると83行目を含むブロックだけが実行される。

vimから呼び出せるようにする

rspec.vimというファイルを作成して、~/.vim/plugin に設置

function RunRspec ()
     :!rspec -cfs %
endfunction
 
function RunRspecLine ()
     exe '!rspec -cfs -l ' . line('.') . ' %'
endfunction
 
au BufRead,BufNewFile *_spec.rb :command! Rspec :call RunRspec()
au BufRead,BufNewFile *_spec.rb :command! Rspecl :call RunRspecLine()

:Rspecで今開いているspecファイルを実行できる。Rspeclで今カーソルがある行を含むブロックのみを実行する。

書き方

hoge.rb

class Hello
  def initiliaze(msg = nil) 
    @message = msg | "world"
  end
 
  def greet
    "Hello @message"
  end
end

hoge_spec.rb

describe Hoge ,"を引数ナシでnewしたとき" do
  before do
    @hoge = Hoge.new
  end  
 
  it "greetすると Hello world が取得される" do  
    @hoge.greet.should == "Hello world"
  end
end

describeはネスト可能、特にRSpec On Railsはネスト前提

# 最も外側にテスト対象のクラスを指定
describe Hoge do 
 
  # 前提条件を記述
  describe "を引数ナシでnewしたとき" do
 
    # before(:all)は、このdescribe内で一度だけ実行される
    before(:all) do
      @hoge = Hoge.new
    end  
 
    # beforeで前提条件を作成する。beforeは各 it ... の前に実行される
    before do
      @hoge = Hoge.new
    end  
 
    # 前提条件を満たす時の想定される動作
    it "greetすると Hello world が取得される" do   
      @hoge.greet.should == "Hello world"
    end
    it "itemsプロパティは空" do
      @hoge.items.should be_empty
    end
  end
 
  describe "・・・・のとき、" do
    # 省略
  end
end

「テスト対象.should (マッチャ) 予想される結果」と書くのが基本。否定のときは「テスト対象.should_not (マッチャ) 予想されない結果」

マッチャ

==
===
=~
<
>
>=
<=
eql
equal
be_nil
be_true
be_false
be_close(expected, delta) 浮動小数点などの誤差がありそうな値ではdelta以内の誤差ならOK

booleanを返す xxx? メソッドは全部 be_xxx でマッチャとして呼べる

be_empty
be_kind_of Object

booleanを返す has_xxx? という名前のメソッドは全部 have_xxx でマッチャとして呼べる。ただしRubyはhas_xxxというメソッドが少ないのであまり使わないかも。

コレクションの数を検査するマッチャ、sizeまたはlengthメソッドを持っているオブジェクトに対して使用可能

have(n).items
have_at_least(n).items
have_at_most(n).items

正規表現

"abcd-12345".should match("/[a-z]{4}-[0-9]{5}/")

例外

lambda{ raise "hoge" }.should raise_error(RuntimeError, /^hoge$/)

状態の変化

# 何かする前と後で値が変わっている事
lambda{ 何か処理 }.should change(レシーバ, メッセージ)
# 前と後の値の差
lambda{ 何か処理 }.should change(レシーバ, メッセージ).by(1)  
# 前と後で取得される値がhogeからfugaになった
lambda{ 何か処理 }.should change(レシーバ, メッセージ).from(hoge).to(fuga)  
# changeの引数はblockも可
a = 1
lambda{ a = a.succ }.should { a }.from(1).to(2)

その他、ブロックの中の条件を満たす事

(1+1).should satisfy { |n| n > 1 } 
rspec.txt · 最終更新: 2011/05/22 08:57 by nullpon