RSpec 使い方
環境は rspec 2.5.0 以降を使用している。
ある行番号のエクスペクテーションを実行する
rspec コマンドに「-l」オプションを使って行番号を指定する。
rspec -l 10 example_spec.rb
エクスペクテーションを途中まで定義する
it メソッドにブロックを書かないと保留される。
it "shoule do something"
また、pending メソッドを使う。
it "should do something" do
pending("under construction")
end
ある条件のときに実行するエクスペクテーションを定義する
it に :if または :unless オプションで条件を指定する。 たとえば Ruby のバージョンによって実行するかどうかを変えるには
it "does something", :if => RUBY_VERSION == 1.9.2 do
end
it "does something", :unless => RUBY_VERSION == 1.9.2 do
end
とする。
条件を反転させる
should の代わりに should_not を使う。
オブジェクトにメソッドが定義されているかをチェックする
respond_to? を使ってチェックするには should respond_to と使う。 たとえば、オブジェクト obj にメソッド size が定義されているかを調べるには
obj.should respond_to(:size)
とする。
配列にオブジェクトが含まれているかどうかをチェックする
include? を使ってチェックするには should include を使う。
ary = [1, 2, 3]
ary.should include(2)
オブジェクトの真偽をチェックする
obj.should be_true
obj.should be_false
obj.should be_nil
整数値をチェックする
num = 10
num.should == 10
num.should < 11
num.should > 9
num.should >= 10
浮動小数点数をチェックする
浮動小数点数 num が 0.333 から誤差 0.0005 の範囲に おさまっているかどうかは、次のようにしてチェックする。
num = 1.0 / 3.0
num.should be_within(0.0005).of(0.333)
要素数をチェックする
配列などの要素数(size や length メソッド)をチェックするには have を使う。
[1, 2].should have(2).items
[1, 2].should have_at_least(1).items
[1, 2].should have_at_most(3).items
正規表現にマッチするかどうかをチェックする
"ABC".should match(/^A/)
エラーが起こらないかどうかをチェックする
lambda で処理を囲み、raise_error を使う。 エラーのクラスやエラーの出力の条件をつけることもできる。
エラーが発生するべきときには
lambda { ... }.should raise_error
lambda { ... }.should raise_error(SomeError)
のようにする。エラーが発生しないようなときは
lambda { ... }.should_not raise_error
とする。
値の変化をチェックする
change メソッドを使うと変化を確認できる。
配列の size メソッドの値が変化するかどうかを確認するには次のようにする。 変化量が 1 であることを確認するには by を使って
a = []
lambda do
a << 0
end.change(a, :size).by(1)
のようにする。
3 から 5 へ変化するようなときは from と to を使う。
a = [1, 2, 3]
lambda do
a << 4
a << 5
end.change(a, :size).from(3).to(5)
change にはブレースのブロックを与えることもできる。
a = []
lambda do
a << 0
end.change { a.size }.by(1)
change の後に do と end は使えないので注意。
subject を使う
subject do
[1, 2, 3]
end
it "should have 3 items" do
subject.should have(3).items
end
対象のクラスを得る
described_class を使うと describe に与えられたクラスを得ることができる。
describe Array do
it "should return Array" do
described_class.should == Array
end
end
let で変数にオブジェクトを自動で代入する
describe Array do
let(:ary) { [1, 2, 3] }
it "should return object_id" do
p ary.object_id
end
it "should return object_id" do
p ary.object_id
end
end
オブジェクト ID が異なるので、テスト毎に異なるオブジェクトが作られていることがわかる。
テストを共有する
shared_examples_for "shared" do
it "should not be empty." do
puts "shared"
subject.should_not be_empty
end
end
describe do
subject do
[1, 2]
end
it_should_behave_like "shared"
it "should have 2 items." do
puts "test"
subject.should have(2).items
end
end
shared_examples_for でテストを作って 対象で it_should_behave_like を実行する。 before や after を含めた実行順序は http://d.hatena.ne.jp/unageanu/20091103 が詳しい。