Rspec

6,108 views

Published on

Rspec

  1. 1. RSpec 一ヶ月さわさわしたので まとめてみた @yuuto
  2. 2. 今日やること <ul><li>Rspec 周りの基本的なところをざーっと。 </li></ul><ul><ul><li>独学なので間違ってても知りません。 </li></ul></ul><ul><li>環境構築とかは書いてません。 </li></ul><ul><ul><li>WEB+DB Press vol.61 あたりが詳しいかも。 </li></ul></ul>
  3. 3. 環境 <ul><li>Ruby 1.8.7,Rails 3.0.7,Rspec 2.4.0 </li></ul><ul><li>↓ GemFile のテスト部分 </li></ul>
  4. 4. RSpec とは <ul><li>プログラムの振る舞いを記述するための DSL </li></ul><ul><li>TDD ではなく振る舞い駆動開発( Behaviour Driven Development: BDD) のための言語 </li></ul>
  5. 5. DSL って? <ul><li>ドメイン特化言語( DomainSpecificLanguage: DSL) </li></ul><ul><ul><li>要はとある目的のために設計された言語のこと </li></ul></ul><ul><ul><li>Rspec でいうと、プログラムの振舞を記述するという目的のために作られた言語、ということ </li></ul></ul>
  6. 6. 振舞い <ul><li>クラスやメソッドの挙動のこと </li></ul><ul><li>挙動を仕様( spec )と言い換えても OK </li></ul>
  7. 7. テストを作るのと何が違うの? <ul><li>テスト駆動だと・・・ </li></ul><ul><ul><li>仕様を決定->それをもとにテストを作成->テストが通る実装を行う </li></ul></ul><ul><li>振舞い駆動だと・・・ </li></ul><ul><ul><li>仕様を定義( spec を記述) -> Rspec を通る実装を行う </li></ul></ul><ul><ul><li>Rspec だと2ステップで分かりやすい </li></ul></ul><ul><li>(つってもそこまで違いはないような気もする・・・) </li></ul>
  8. 8. RSpec の書き方は? <ul><li>例えばこんな感じ </li></ul>
  9. 9. Rspec の書き方は? (2) <ul><li>describe と context </li></ul><ul><ul><li>振舞いをざっくり説明 </li></ul></ul><ul><ul><li>describe で対象、 context で状況を記述 </li></ul></ul><ul><ul><ul><li>(どっちも直接何かをしてくれるわけではないよ) </li></ul></ul></ul><ul><ul><li>ネスト可能 </li></ul></ul>
  10. 10. Rspec の書き方は? (3) <ul><li>before </li></ul><ul><ul><li>テスト前に行う処理を記述 </li></ul></ul><ul><li>subject </li></ul><ul><ul><li>テスト対象を記述 </li></ul></ul><ul><li>it </li></ul><ul><ul><li>テストを記述 </li></ul></ul>
  11. 11. 実行するとこんな感じ Describe や it で書いた文言がそのまま出てます。 ※ この出力が仕様書のようになるのが理想
  12. 12. it と its の違い
  13. 13. it と its の違い (2) <ul><li>Its は subject で指定した要素の属性を指定できて、2種類の使い方がある </li></ul><ul><ul><li>シンボルで指定(さっきの。) </li></ul></ul><ul><ul><li>文字列で指定 </li></ul></ul><ul><ul><ul><li>文字列だと↓みたいにネストでの指定もできる </li></ul></ul></ul><ul><ul><ul><li>subject {@empty_array} </li></ul></ul></ul><ul><ul><ul><li>its ('methods.size') { should == 248 } </li></ul></ul></ul>
  14. 14. matcher actual.should matcher(expected) actual.should_not matcher(expected) should は、 actural を matcher の条件を満たすことを期待するという意味。 should と should_not は Object に定義されている。
  15. 15. matcher(2) <ul><li>演算子マッチャ (>,<,==…) </li></ul><ul><li>ビルトインのマッチャ( have().items,include(),match()… ) </li></ul><ul><li>be_xxxx(be_empty… メソッドの前に be_ ) </li></ul><ul><li>be_true と be_false </li></ul><ul><li>have_xxx(has_xxx) {:a => &quot;A&quot;}.has_key?(:a) </li></ul><ul><li>カスタムマッチャ(自分で定義するマッチャ) </li></ul>
  16. 16. stub <ul><li>コールに対して定義された結果を返す </li></ul><ul><ul><li>Model(activerecord) に対してよく使う </li></ul></ul>・ User#create がコールされたときは User.new を返す。 ・ User#find_by_name がコールされたときは、   factory_girl で定義されている「 default_user 」を返す。 ※ factory_girl については後ほど。
  17. 17. mock <ul><li>コールに対して定義された結果を返して且つコールされたことを検証する </li></ul>spec 実行結果
  18. 18. Webmock <ul><li>http リクエストを乗っ取ってレスポンスを指定できる </li></ul><ul><ul><li>Http リクエストするのにどんなライブラリ使ってても stub できるので便利 </li></ul></ul>stub_request の括弧内が条件。 この条件にマッチするリクエストを行われたら、 実際にリクエストする代わりに to_return に記述したレスポンスを返却する。
  19. 19. factory_girl <ul><li>Test 用のモデルデータを生成してくれる </li></ul><ul><li>${PROJECT_HOME}/spec/factories 配下にモデルに対応する rb ファイルを作成 </li></ul><ul><li>モデル間の関連を定義できたりする </li></ul>
  20. 20. factory_girl(2) Factory ファイル Spec ファイル Factory(: ~ ) もしくは Factory.create(: ~ ) で DB 登録。 一部だけデータ変えることも可能。 インスタンスを作りたいだけなら Factory.build(: ~ ) で。 定義したものを継承( parent 指定)してさらに定義とかできる。
  21. 21. database_cleaner <ul><li>Factory_girl とかで DB 登録したデータを自動で消してくれる。 </li></ul><ul><li>@ran_tan 曰く、「デフォで消してくれますよ?」とか言ってたけど自分の環境だと消えないので仕方なく導入。 </li></ul><ul><li>spec_helper.rb に削除するタイミングを記述。 </li></ul>
  22. 22. Database_cleaner(spec_helper.rb)
  23. 23. :each, :all <ul><li>before,after のデフォルトは :each </li></ul><ul><li>:each は it それぞれに対して処理される </li></ul><ul><li>:all は親ノードに対して一回のみ処理される </li></ul>
  24. 24. :each, :all(2) <ul><li>routes.rb に定義していれば、 contoller の spec では「 get :index 」みたいにコールできたり、「 controller.hoge 」みたいにテスト対象を controller という変数で参照できるが、これは it 内か before(:each) のみ。 before(:all) だと routes の読み込みが終わってないっぽい? </li></ul>
  25. 25. 参考文献 <ul><li>WEB+DB PRESS vol.61 </li></ul><ul><ul><li>特集 2 Rails3 テスト最前線 </li></ul></ul><ul><li>るびま </li></ul><ul><ul><li>http:// jp . rubyist .net/magazine/?0021-Rspec#l29 </li></ul></ul><ul><li>t-wada の日記 </li></ul><ul><ul><li>http://d. hatena . ne . jp / t-wada /20100228/p1 </li></ul></ul><ul><li>Func09 </li></ul><ul><ul><li>http://www. func 09.com/ wordpress /archives/532 </li></ul></ul>
  26. 26. おわり。

×