应用测试与Rails插件:功能拓展与实践
1. 应用测试
在应用开发中,测试是确保功能正常运行的关键环节。以下是对不同控制器和功能的测试内容。
1.1 故事关联测试
test "voted on association" do
assert_equal [ stories(:one) ],
users(:glenn).stories_voted_on
end
该测试依赖于固定数据,能直接断言测试用户投票的故事列表与预期列表相等。
1.2 故事控制器测试
为故事控制器添加了诸多功能,对应的测试也更为复杂。以下是具体测试内容:
-
故事索引页面测试
:
- 在
test/fixtures/stories.yml
中添加新故事:
promoted:
name: What is a Debugger?
link: http://en.wikipedia.org/wiki/Debugger/
user: john
votes_count: 5
- 修改并添加测试方法:
class StoriesControllerTest < ActionDispatch::IntegrationTest
# 其他测试方法...
test "gets stories" do
get stories_path
assert_response :success
assert response.body.include?(stories(:promoted).name)
end
test "gets bin" do
get bin_stories_path
assert_response :success
assert response.body.include?(stories(:two).name)
end
# 其他测试方法...
end
这两个测试调用相应动作,检查请求是否成功响应,并确认是否渲染了合适的故事。
- 路由配置测试 :
test "story index is default" do
assert_recognizes({ controller: "stories",
action: "index" }, "/")
end
该断言确认对“/”的请求会被路由到
StoriesController
的
index
动作。
- 页面标题测试 :
test "shows story on index" do
get stories_path
assert_select 'h2', 'Showing 1 frontpage story'
assert_select 'div#content div.story', count: 1
end
test "show stories in bin" do
get bin_stories_path
assert_select 'h2', 'Showing 2 upcoming stories'
assert_select 'div#content div.story', count: 2
end
这些测试确认标题标签包含正确的标题和预期数量的故事。
- 故事提交表单测试 :
test "new shows new form" do
login_user
get :new
assert_select 'form p', count: 3
end
此测试检查表单标签下
p
元素的数量是否符合预期。
- 故事显示页面测试 :
test "show story vote elements" do
login_user
get story_path(stories(:one))
# 方法主体...
end
test "does not show vote button if not logged in" do
get story_path(stories(:one))
assert_select 'div#vote_link', false
end
这些测试处理未登录用户看不到投票按钮的情况。
- 导航菜单测试 :
test "show navigation menu" do
get stories_path
assert_select 'ul#navigation li', 3
end
该测试检查导航菜单列表项的数量。
- 故事提交者链接文本测试 :
test "show story submitter" do
get story_path(stories(:one))
assert_select 'p.submitted_by span a', 'Glenn Goodrich'
end
此测试确保故事提交者链接到其用户页面。
1.3 投票控制器测试
由于投票程序修改为仅对登录用户可用,需要修改现有测试并添加新测试:
test "stores user with vote" do
post story_votes_path(stories(:two))
stories(:two).reload
assert_equal users(:glenn), stories(:two).votes.last.user
end
该测试确认投票动作会存储当前用户。
1.4 用户控制器测试
添加三个测试来覆盖用户页面的功能:
class UsersControllerTest < ActionController::TestCase
test "show user" do
get user_path(users(:glenn))
assert_response :success
assert response.body.include?(users(:glenn).name)
end
test "show submitted stories" do
get user_path(users(:glenn))
assert_select 'div#stories_submitted div.story', count: 2
end
test "show stories voted on" do
get user_path(users(:glenn))
assert_select 'div#stories_voted_on div.story', count: 1
end
end
这些测试确认显示动作能找到正确的用户,并正确显示用户提交的故事和投票历史。
1.5 完整测试套件运行
使用以下命令运行完整测试套件:
$ rails test
运行结果显示测试通过,表明应用状态良好。
2. Rails插件
Rails插件是扩展应用功能的重要方式,以下将介绍插件相关内容。
2.1 插件概述
插件是可添加到应用中以扩展其功能的组件。可通过在
Gemfile
中添加插件并运行
bundle install
将其引入现有Rails应用。常见的插件功能包括:
- 扩展
ActiveRecord
功能
- 辅助方法
- 新的模板引擎
可在
Rubygems
或
Ruby Toolbox
网站搜索Rails插件。
2.2 标签功能与
acts-as-taggable-on
插件
为应用添加标签功能,可使用
acts-as-taggable-on
插件。以下是该插件的相关信息:
-
插件历史
:该插件有一段发展历史,最初由David Heinemeier Hansson开发
acts_as_taggable
,后经Jonathan Viney和Michael Bleigh等人改进。
-
acts_as_*
命名约定
:在Rails插件仓库中有许多
acts
,它们是对
ActiveRecord
模型的功能扩展,能让模型“表现得像其他东西”。常见的“acts as”宝石有
acts_as_list
、
acts_as_tree
和
acts_as_paranoid
等。
-
插件功能
:
acts-as-taggable-on
插件提供了一种简单有效的方式使模型可标签化,自带
ActsAsTaggableOn::Tag
模型类,能将以空格分隔的标签列表解析为单独的模型对象。
2.3 安装
acts-as-taggable-on
插件
安装步骤如下:
1. 进入应用根目录,在
Gemfile
中添加以下行:
gem "acts-as-taggable-on", "~> 4.0"
- 运行以下命令:
$ bundle install
安装完成后,插件会有安装后消息提示下一步操作。
2.4 创建插件迁移
为使故事模型可标签化,需创建迁移来存储标签和标签与故事的关系。使用以下命令创建迁移:
$ rails acts_as_taggable_on_engine:install:migrations
该命令会复制多个迁移文件到
db/migrate
目录。
acts-as-taggable-on
插件使用两个表:
| 表名 | 作用 |
| ---- | ---- |
|
tags
| 存储
ActsAsTaggableOn::Tag
模型,每个标签有一个条目 |
|
taggings
| 存储
ActsAsTaggableOn::Tag
模型与使用该插件功能的模型之间的映射 |
迁移代码如下:
class ActsAsTaggableOnMigration < ActiveRecord::Migration
def self.up
create_table :tags do |t|
t.string :name
end
create_table :taggings do |t|
t.references :tag
# 确保创建的列足够长以存储所需的类名
t.references :taggable, polymorphic: true
t.references :tagger, polymorphic: true
# 限制是为了防止MyISAM表类型的索引长度出现MySQL错误
t.string :context, limit: 128
t.datetime :created_at
end
add_index :taggings, :tag_id
add_index :taggings, [:taggable_id, :taggable_type, :context]
end
def self.down
drop_table :taggings
drop_table :tags
end
end
在给故事模型添加
acts-as-taggable-on
功能之前,需应用刚刚生成的迁移。
通过以上测试和插件的使用,能确保应用功能正常运行并扩展其功能,为进一步开发打下坚实基础。
应用测试与Rails插件:功能拓展与实践
3. 测试与插件的实践价值
在应用开发过程中,测试和插件的运用具有不可忽视的价值,下面从几个方面进行分析。
3.1 测试的重要性
测试是保障应用质量的关键环节,通过对各个控制器和功能进行全面测试,可以及时发现潜在的问题,避免在生产环境中出现故障。具体来说,测试的重要性体现在以下几个方面:
-
功能验证
:确保每个功能都能按照预期工作,如故事的提交、投票、显示等功能。
-
兼容性检查
:在不同的环境和条件下,保证应用的兼容性和稳定性。
-
代码维护
:当对代码进行修改或扩展时,测试可以帮助确认修改是否影响了其他功能,降低维护成本。
3.2 插件的优势
使用插件可以快速扩展应用的功能,减少开发时间和工作量。以
acts-as-taggable-on
插件为例,其优势主要包括:
-
节省开发成本
:避免了从头开始开发标签功能,利用现有的成熟插件可以提高开发效率。
-
功能丰富
:插件通常具有完善的功能和良好的兼容性,能够满足不同的需求。
-
社区支持
:流行的插件有活跃的社区支持,遇到问题可以及时获得帮助和更新。
4. 操作流程总结
为了更清晰地展示应用测试和插件使用的操作流程,下面通过流程图和列表进行总结。
4.1 测试流程
graph LR
A[编写测试用例] --> B[运行测试套件]
B --> C{测试是否通过}
C -- 是 --> D[应用功能正常]
C -- 否 --> E[调试修复问题]
E --> B
测试流程具体步骤如下:
1.
编写测试用例
:针对不同的控制器和功能,编写相应的测试代码,如故事控制器测试、投票控制器测试等。
2.
运行测试套件
:使用
rails test
命令运行所有测试用例。
3.
检查测试结果
:如果测试通过,说明应用功能正常;如果测试失败,需要进行调试和修复。
4.
重复测试
:修复问题后,再次运行测试套件,直到所有测试都通过。
4.2 插件使用流程
graph LR
A[选择插件] --> B[安装插件]
B --> C[创建迁移]
C --> D[应用迁移]
D --> E[使用插件功能]
插件使用流程具体步骤如下:
1.
选择插件
:根据应用的需求,选择合适的插件,如
acts-as-taggable-on
插件。
2.
安装插件
:在
Gemfile
中添加插件信息,并运行
bundle install
命令进行安装。
3.
创建迁移
:使用插件提供的生成器方法创建迁移文件,如
rails acts_as_taggable_on_engine:install:migrations
。
4.
应用迁移
:运行迁移命令,将迁移文件应用到数据库中。
5.
使用插件功能
:在应用中使用插件提供的功能,如为故事添加标签。
5. 总结与展望
通过对应用进行全面测试和使用插件扩展功能,我们可以确保应用的质量和稳定性,同时提高开发效率。在未来的开发中,可以继续探索更多的测试方法和插件,进一步优化应用的性能和功能。
- 测试方面 :可以引入自动化测试框架,实现持续集成和持续部署,提高测试的效率和准确性。
- 插件方面 :关注Rails社区的最新动态,及时发现和使用新的插件,为应用添加更多的功能。
总之,测试和插件是应用开发中不可或缺的部分,合理运用它们可以让我们的应用更加出色。
超级会员免费看

被折叠的 条评论
为什么被折叠?



