ViewのRSpecを書いてみた

現在ネットショップを作っているのですが、やや複雑なビジネスロジックを持っています。当然モデルはRSpecを書いて仕様の確認(テスト)しているのですが、開発中に注文の確認画面の表示がおかしい問題がよく発生しました。

View自身はモデルやヘルパーの呼び出しが主ですが if で表示を変えたりする部分もありモデルが正しいからといって表示も大丈夫とはなりません。

さらに、注文の確認画面はお客様に、お買い物の金額を伝える大切な画面です。ここにバグがあるとネットショップとしてはたいへんな問題になります。ということで 注文の確認画面 View にもテスト・RSpecを書く事にしました。

ViewのRSpecの書き方

RSpecのページに View Example がありますが、これだけでは良く解りません ^^; しかし、RDocの中のサンプルがとても参考になります。
モデルやコントロラーのRSpecではクラス名でテスト対象との対応を取っていますが、Viewにはクラス名が無いので render で明示的にテンプレートを指定します。

Viewのテストはhave_tagマッチャーで対象要素(タグ)をCSSセレクターで指定しますのでどんなHTMLの中から対象要素が特定できますが、デザインやレイアウト変更の影響を減らすためにも、テスト対象の要素(タグ)にはIDを付けてしまうのが良いと思います(思いました)。


ViewのRSpecの例

require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')

describe "_order_list.html.erb" do
  fixtures :orders, :order_items, :stocks, :products, :customers,

  describe "XXXXな場合" do
    before(:each) do
      assigns[:order] = orders(:or01)
      render "order/_order_list"
    end

    it "正しい単価がが表示されている" do
      response.should have_tag('#unit_price1', /¥26,000/)
      response.should have_tag('#unit_price2', /¥30,000/)
      response.should have_tag('#unit_price3', /¥14,800/)
    end

   ・・・

    it "正しい合計金額が表示されている" do
      response.should have_tag('#total', '¥96,800')
    end
  end

end