icon 《基础 Ruby on Rails》的示例程序asagao与Rails2.2相适应

一口气通过所有功能测试

上一章中,通过了 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

太好了,功能测试全部通过了。

但是,还是出现了大量的警告。如同在 功能测试开头部分的修改等后半部分的说明的一样, Rails1.2时的功能测试,到了Rails2.2便包含了多余的代码,这就是警告的原因。

至于/test/functional 目录以下的全部文件,删除1-5行,通过


require 'test_helper'

替换。

这样就全部通过了单元测试和功能测试。


即使通过了测试,不能绝对保证应用程序中没有错误。

但是,将所有测试大概都做了一下,因为Rails升级而带来的问题大部分也都能解决了。

要自信地升级Rails的版本,认真地做测试很重要。

(2008/12/21)