おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

Rspecではそれぞれの検証が分離している

 言葉にすると至極あたりまえの話のような気もしますが、Rspecでは、モデルとコントローラとビューのテストはそれぞれ分離されています(Rspecでも、should have_tagでビューの検証ができてしまいますが、結合度が密になりやすそうなのであまり使わないほうがいいかもです)。結合度を疎にすることによって、コントローラの仕様を考えるときはそれに専念することができます。そして、どこかのエラーが他に影響を及ぼすのを防いでいます。例えば、ビューの仕様を変更してエラーが出たとき、そのビューの仕様をコントローラに書いているとコントローラでもエラーが出る(当たり前すぎることを書いていますね)のです。
 とはいえ、Test::Unitのfunctionテストとかだと、結構普通にコントローラとビューのテストを一緒に書いちゃってます。

  def test_diary  
    get "diary", {:id => diaries(:abe_1).id}  
    assert_response :success  
    assert_template "diary/show"  
    assert_select "#diary_#{diaries(:abe_1).id}" do  
      assert_select "#title", diaries(:abe_1).title  
      assert_select "#body", diaries(:abe_1).body  
    end  
  end  

 ここでデザイナさんが、日記の内容のIDを”#message”に変えたりすると、このテストはエラーになってしまいます。しかし、コントローラがおかしくてエラーになるわけではないのです。
 さらにいうと、ここでDiaryモデルがid値からインスタンスを取得する部分の仕様を変えたときに、エラーになる可能性があります。
 ここで疎結合を保つために登場するのがmockとstubなのですね。なるほど。