一気に機能テストを全部通す
2008/12/21
前回は、account コントローラの機能テストを通しました。
コントローラ admin/members、admin/groups、admin/articles で出ている 4 個のエラーを残すのみとなりました。一挙に終わらせましょう。
まず、app/views/admin/members/index.rhtml
<% if @member_pages.page_count > 1 -%> <div class="pagination"> <%= my_pagination_links @member_pages %> </div> <% end -%>
を次のように修正します。
<%= will_paginate @members, :previous_label => '前へ', :next_label => '次へ', :inner_window => 2 %>
次に、app/controllers/admin/groups_controller.rb
の choose_members
メソッド
def choose_members @group = Group.find(params[:id]) page = params[:page] ? params[:page].to_i : 1 options = { :order => 'member_number', :limit => MEMBERS_PER_PAGE, :offset => MEMBERS_PER_PAGE * (page - 1) } @members = Member.find(:all, options) @member_pages = Paginator.new( self, Member.count, MEMBERS_PER_PAGE, page) @member_checked = {} @members.each do |m| if @group.members.any? {|gm| gm.id == m.id } @member_checked[m.id] = true end end @member_ids_by_page = (@members.collect {|m| m.id }).join(',') end
を次のように修正します。
def choose_members @group = Group.find(params[:id]) @members = Member.paginate(:page => params[:page], :per_page => MEMBERS_PER_PAGE, :order => 'member_number') @member_checked = {} @members.each do |m| if @group.members.any? {|gm| gm.id == m.id } @member_checked[m.id] = true end end @member_ids_by_page = (@members.collect {|m| m.id }).join(',') end
続いて、app/views/admin/groups/choose_members.rhtml
<% if @member_pages.current.next -%> <%= hidden_field_tag 'next_page', @member_pages.current.next.number %> <%= submit_tag '決定して次のページへ' %> <% else -%> <%= submit_tag '決定して終了' %> <% end -%> (<%= @member_pages.current.number %>/<%= @member_pages.length %>ページ)
を次のように修正します。
<% if @members.next_page -%> <%= hidden_field_tag 'next_page', @members.next_page %> <%= submit_tag '決定して次のページへ' %> <% else -%> <%= submit_tag '決定して終了' %> <% end -%> (<%= @members.current_page %>/<%= @members.total_pages %>ページ)
ここでは mislav-will_paginate プラグインによって追加される next_page
, current_page
, total_pages
などのメソッドを使用しています。
詳しくは will_paginate documentation を参照してください。
そして、app/controllers/admin/articles_controller.rb
の index
メソッド
def index @article_pages, @articles = paginate(:articles, :order => 'released_at desc, id asc', :per_page => ARTICLES_PER_PAGE) end
を次のように修正します。
def index @articles = Article.paginate(:page => params[:page], :order => 'released_at desc, id asc', :per_page => ARTICLES_PER_PAGE) end
最後に、app/views/admin/articles/index.rhtml
<% if @article_pages.page_count > 1 -%> <div class="pagination"> <%= my_pagination_links @article_pages %> </div> <% end -%>
を次のように修正します。
<%= will_paginate @members, :previous_label => '前へ', :next_label => '次へ', :inner_window => 2 %>
test:functionals
タスクを実行すると…
92 tests, 335 assertions, 0 failures, 0 errors
晴れて、機能テストすべてが通りました。
ただし、まだ大量の警告が表示されます。機能テスト冒頭部分の修正、等の後半で説明したように、Rails 1.2 時代に作った機能テストには、Rails 2.2 で余分なコードが含まれており、それが警告の原因です。
/test/functional
ディレクトリ以下の全ファイルについて、1-5 行を削除し、
require 'test_helper'
で置き換えてください。
以上で、単体テストと機能テストがすべて通りました。
テストが通っても、アプリケーションにバグがないという絶対的な保証にはなりません。
しかし、ある程度網羅的にテストを作成してあれば、Rails のアップグレードによってもたらされる問題の大部分は解消されているはずです。
自信を持って Rails のバージョンを上げるには、きちんとテストを作っておくことが重要です。