一気に機能テストを全部通す
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 のバージョンを上げるには、きちんとテストを作っておくことが重要です。
