一気に機能テストを全部通す

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.rbchoose_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.rbindex メソッド

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