RSpecはDSLなので、決め事を覚えないと使いこなせない。
よく使うことになるであろう、参考リンクを列挙しておく。
前処理、後処理
- xUnitでおなじみのsetUp()、tearDown()ではなく、before、afterを使う
- before、afterは複数定義できる
- 参考:before / after メソッド # Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)
aeertion(expectation)
- テストに成功したかどうかは、「xxx.should xxx」または「xxx.should_not xxx」という文で判定する
- should(またはshould_not)の後ろに付けるの(matcherという)は、演算子(「== 123」とか)の他、予め用意されたmatcherが使える
- 参考:
change matcher
- 処理前と処理後の値を変化をテストするために、change matcherというものが用意されている
- 参考:change マッチャ # Rubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)
Controllerのテスト
- HTTP Response Codeのテストに使うmatcher
- 200 OKのテスト → be_success
- 300系のテスト → be_redirect
- その他 → 用意されていないようだ
- ControllerがどのViewを使うか(テンプレートの選択)のテストには、render_template()というmatcherを使う
#例
response.should render_template('members/index') - 参考:
Viewのテスト
- 参考:
Mock(mock_model)
- MockはModelのモックとして使い、かつ、そのモックのメソッドが想定どおり呼び出されたかをテストできる
- モックからの戻り値をテスト内で使わない場合、and_return()は省略できる
- テストはせずにスタブとして使うこともできる
- mock_modelを使う場合、idは生成時に指定しないと内部的に勝手に作ってしまうので注意
#例
member = mock_model(Member)
member.stub!(:id).and_return(100)
member.id.should == 100 # => これはOK(Green)だが...
#Viewで「link_to('link', member)」している部分をテスト
response.should have_tag('a[href=?]', '/members/100') # => これはNG(Red)になる
#調べてみると、内部的なIDが使われたようで、「/members/1001」というパスになっていた
上記の例は、下記のようにmock_model生成時にidも指定すれば問題は起きないmember = mock_model(Member, :id => 100)
- 参考:
参考:
RSpec をもっと理解したかったので、まとめを作りました - takihiroの日記
RSpec.info: Writing
Index of /rspec (公式?仕様書)
0 件のコメント:
コメントを投稿