《基础 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.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
太好了,功能测试全部通过了。
但是,还是出现了大量的警告。如同在 功能测试开头部分的修改等后半部分的说明的一样, Rails1.2时的功能测试,到了Rails2.2便包含了多余的代码,这就是警告的原因。
至于/test/functional 目录以下的全部文件,删除1-5行,通过
require 'test_helper'
替换。
这样就全部通过了单元测试和功能测试。
即使通过了测试,不能绝对保证应用程序中没有错误。
但是,将所有测试大概都做了一下,因为Rails升级而带来的问题大部分也都能解决了。
要自信地升级Rails的版本,认真地做测试很重要。
(2008/12/21)
- 前言
- 功能测试开头部分的修改等 (2008/12/01)
- rake rails:update (2008/12/15)
- Cookie Store (2008/12/16)
- 分页 (2008/12/17)
- blog_entries 控制台的修改 (2008/12/20)
- 单例资源 (2008/12/21)
- 一口气通过所有功能测试 (2008/12/21)
- 综合测试和rak (2008/12/22)
- 国际化(i18n)的第一步 (2008/12/26)
- 基于Cookie的区域的切换 (2009/01/04)
- ActiveRecord 模型的字段名的国际化 (2009/01/08)
- 错误信息的国际化(1) (2009/01/09)
- 错误信息的国际化(2) (2009/01/10)
- 错误信息的国际化(3) (2009/01/17)
- 错误信息的国际化(4) (2009/01/24)

