RSpecで使う基本メソッド(describe/context/it/its/before/after/subject/let/shared_examples_for)をまとめてみる。
参考リンク
基本メソッド
describe/context - テスト名。テスト対象自身のオブジェクト(subject代わり)でもOK
before - 事前条件。example(it)の前に実行される。before :each はexample毎、before :all はdescribe毎に呼ばれる
after - 事後処理。以後のテストに影響が出ないように後始末が必要な時に記述する
subject - 評価対象。shouldの前のオブジェクトを指定することでit内のオブジェクトを省略できる
it - テスト仕様。マッチャーを使って評価する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 一番上のdescribeはテスト対象にしておくといい。subjectにもなる
describe Controller do
# contextはdescribeのalias。テスト対象にgetのときとか事前条件変えるときはこっちの方が読みやすいかも
context "handling AccessDenied exceptions" do
# デフォルトはbefore :each
# 事前条件はitにも書けるけど、なるべく分けるように
before { get :index } # 1行になるべく書く
# itのテスト対象。shouldの前を省ける
subject { response }
# itの後に概要書けるけど、マッチャーだけで意味通るなら省略する
it { should redirect_to ( "/401.html" ) }
end
end
it(context, tags) - タグが付けられる
$ rspec --tag ruby:1.8
1
2
3
4
5
6
7
8
9
10
11
describe "Something" do
# ruby:1.8
it "behaves one way in Ruby 1.8" , :ruby => "1.8" do
. . .
end
# ruby:1.9
it "behaves another way in Ruby 1.9" , :ruby => "1.9" do
. . .
end
end
its(method) - subjectのメソッドが呼べる
1
2
3
4
5
6
7
describe [ 1 , 2 , 3 , 3 ] do
# [1,2,3,3].size.should == 4
its ( :size ) { should == 4 }
# [1,2,3,3].uniq.size.should == 3
its ( "uniq.size" ) { should == 3 }
end
let - example内で同じオブジェクトの使い回し
1
2
3
4
5
6
7
8
9
10
11
12
13
14
describe BowlingGame do
# example毎に呼ばれる。でも遅延評価。使わなかったら呼ばれない
let ( :game ) { BowlingGame . new }
it "scores all gutters with 0" do
20 . times { game . roll ( 0 ) }
game . score . should == 0
end
it "scores all 1s with 20" do
20 . times { game . roll ( 1 ) }
game . score . should == 20
end
end
shared_examples_for - exampleの共通化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
shared_examples_for "a single-element array" do
# letやbeforeやafterも書ける。要はなんでも共通化
let ( :xxx ) { Obj . new }
before { puts 'before' }
after { puts 'after' }
# subjectやletを渡せる
it { should_not be_empty }
it { should have ( 1 ) . element }
end
describe [ "foo" ] do
it_behaves_like "a single-element array"
end
describe [ 42 ] do
it_behaves_like "a single-element array"
end
shared_context - 事前条件の共通化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
shared_context '要素がふたつpushされている' do
let ( :latest_value ) { 'value2' }
before do
@stack = Stack . new
@stack . push 'value1'
@stack . push latest_value
end
end
describe Stack do
describe '#size' do
include_context '要素がふたつpushされている'
subject { @stack . size }
it { should eq 2 }
end
describe '#pop' do
include_context '要素がふたつpushされている'
subject { @stack . pop }
it { should eq latest_value }
end
end
次回はMockについてまとめてみます。