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 が詳しい。

参考

Tags of current page

, ,