web-k.log

RubyやWebをメインに技術情報をのせていきます

RSpecまとめ(1)~基本メソッド~

| Comments

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についてまとめてみます。

Comments