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