《基础 Ruby on Rails》的示例程序asagao与Rails2.2相适应
单例资源
上一章中,通过了 blog_entries 控制台的功能测试。
这章来看一下 account 控制台。
> ruby -Itest test/functional/account_controller_test.rb
Loaded suite test/functional/account_controller_test
Started
FF....
Finished in 0.262014 seconds.
1) Failure:
test_edit1(AccountControllerTest)
[/usr/lib/ruby/gems/1.8/gems/actionpack-2.2.2/lib/action_controller/assertions/selector_assertions.rb:297:in `assert_select'
test/functional/account_controller_test.rb:49:in `test_edit1'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']:
Expected at least 1 element matching "form[action='/account']", found 0.
<false> is not true.
2) Failure:
test_routing(AccountControllerTest)
[test/functional/account_controller_test.rb:18:in `test_routing'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__'
/usr/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']:
The generated path <"/account/show"> did not match <"/account">
6 tests, 17 assertions, 2 failures, 0 errors
这次好像与分页没有关系。
从测试方法 test_routing 开始看吧。失败出现在下面这个地方。
assert_generates '/account',
{ :controller => 'account', :action => 'show' }
这是由于从 Rails2.0 开始,单例资源的控制台名称从单数型变成了复数型。
对应 account 资源的控制台不是 account_controller.rb ,变成了 accounts_controller.rb 。因此,路由混乱了。
所谓单例资源
在某文本中存在的, Web 程序里唯一的一个资源。
例如,“帐户”这个资源虽然存在复数,但是在某个用户登录的情况下,“我的帐户”这个资源只存在一个。
Rails 中,通过 /accounts 这个 URL 路径表示“帐户列表”,由 /accounts/99 表示“id 是 99 的帐户”,/account 表示“我的帐户”。
Rails 1.2 时代,还需要分别为普通资源和单例资源配置不同的控制台,Rails 2.0 以后就可以使用相同的控制台来处理了。
按照下面的顺序测试便通过了。
- 将
/app/controllers/account_controller.rb的文件名变为accounts_controller.rb。 - 打开
accounts_controller.rb,把类名从AccountController变成AccountsController。 /app/views/account的目录名称变为accounts。/test/functional/account_controller_test.rb的文件名变成accounts_controller_test.rb。- 打开
accounts_controller_test.rb,做如下修改。- 删除第2-5行。
- 把类名从
AccountControllerTest变为AccountsControllerTest。 - 在
setup方法中使用的AccountController变成AccountsController。 - 将
test_routing方法做如下改正。
def test_routing
assert_generates '/account',
{ :controller => 'accounts', :action => 'show' }
assert_generates '/account/edit',
{ :controller => 'accounts', :action => 'edit' }
assert_generates '/account',
{ :controller => 'accounts', :action => 'update' }
end
如果执行 test:functionals 任务的话……
92 tests, 315 assertions, 0 failures, 4 errors
失败从 2 减到 0 。剩下的只是 4 个错误。今天就讲到这吧。
(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)

