- 浏览: 1309224 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (732)
- Java_about (146)
- Spring_Hibernate_Struts_OpenSource (27)
- linux_unix (62)
- life_sth (22)
- js_css_html_xml_nodejs (69)
- design_pattens (1)
- Perl (8)
- php_ecshop (4)
- DB_Mysql_Oracle_Informix_SqlServer (43)
- JSTL (8)
- Testing_自动化测试 (42)
- DB_ID_UUID (4)
- SEM_SEO (1)
- english_study_improvement (4)
- SVN_Git (9)
- WebService_SOA_CloudComputing (3)
- E-Commerce (1)
- Lucene_Solr (7)
- others (2)
- Regex (2)
- tomcat_jetty (8)
- zeroc-ice (1)
- java_excel (5)
- ant_maven_gradle (5)
- Unity_VR_AR_C# (2)
- jmeter (1)
- XPath_dom4j (1)
- Ruby_and_Rails (68)
- write_a_rails (17)
- manage_and_team (1)
- getting_real (1)
- ubuntu (20)
- git_and_git_flow (7)
- TODO (1)
- PM_design (2)
- Python_and_Django (8)
- NoSql_mongo_redis (24)
- C/C++ (3)
- vi_vim_gvim (0)
- c#_.Net_windows编程_dll (10)
- Php_and_Yii (9)
- Android_IOS (31)
- Mysql (5)
- sa_运维_network_硬件 (37)
- lua (2)
- c_cpp_VisualStudio (21)
- 硬件-RM-Arduino (6)
最新评论
-
shenkun58:
...
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
liaojia1:
正解,感谢
NoClassDefFoundError: Could not initialize springframework.BeanCreationException -
flingfox63:
谢谢分享,电脑上有IPV6,导致了Guard启动不了……
ruby错误解决: Address family not supported by protocol - connect(2) -
c39274936:
s = "hello_world_ruby" ...
驼峰格式和下划线格式转换_translation between camel and snake format -
yfj300:
学习了学习了学习了学习了
硬盘基本知识(磁道、扇区、柱面、磁头数、簇、MBR、DBR)
Rails源码阅读(十)在console 使用ActionController::Integration::Session
ActionController::Integration::Session
在script/console的console_app中,使用的句柄是app,返回ActionController::Integration::Session的一个实例。
可以使用的方法1:模拟请求
app的public方法:
delete
delete_via_redirect
follow_redirect!
get
get_via_redirect
head
host!
https!
https?
new
post
post_via_redirect
put
put_via_redirect
redirect?
request_via_redirect
reset!
url_for
xhr
xml_http_request
这些都是模拟http请求的。
例如get方法,模拟get请求,path参数是请求的地址等。
def get(path, parameters = nil, headers = nil) process :get, path, parameters, headers end
实验:
?> status = app.get '/login'
=> 200
process方法代码分析:
#核心代码 app = Rack::Lint.new(@application) status, headers, body = app.call(env)
从@application是ActionDispatcher的实例可以看出,启动了rack,来处理用户的get post等请求。
这段代码之前主要是rack的准备工作;
这段代码之后的代码在处理rack的返回值工作;
另外,为了配合集成测试,需要在处理请求后,可以做assert操作,这就需要能够得到请求的轨迹,也就是请求了哪个controller,哪个action,request参数,response值等,也就是:
if @controller = ActionController::Base.last_instantiation @request = @controller.request @response = @controller.response @controller.send(:set_test_assigns) #这里使用了module ProcessWithTest else # Decorate responses from Rack Middleware and Rails Metal # as an Response for the purposes of integration testing @response = Response.new @response.status = status.to_s @response.headers.replace(@headers) @response.body = @body end # Decorate the response with the standard behavior of the # TestResponse so that things like assert_response can be # used in integration tests. @response.extend(TestResponseBehavior) #response都加了这些功能
请求的返回值是:return @status
可以使用的方法2: 单元测试
Included Modules包括:
Test::Unit::Assertions
ActionController::TestCase::Assertions
ActionController::TestProcess
这样,可以在app中使用上面3个测试模块的方法。
例如:
app.assert true
app.assert false
实验:
?> app.assert true
=> nil
>> app.assert false
Test::Unit::AssertionFailedError: <false> is not true.
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:48:in `assert_block'
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:500:in `_wrap_assertion'
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:46:in `assert_block'
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:63:in `assert'
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:495:in `_wrap_assertion'
from /opt/ruby/lib/ruby/1.8/test/unit/assertions.rb:61:in `assert'
from (irb):97
from :0
可以使用的方法3:命名路由
初始化的源代码:
# Create and initialize a new Session instance. def initialize(app = nil) @application = app || ActionController::Dispatcher.new reset! end
这里的实例@application是ActionController::Dispatcher的实例,这个实例是rails的入口(详细看前面文)
reset!方法中除了做了些初始化的操作(例如把host设置为"www.example.com"),还包含了命名路由:
unless defined? @named_routes_configured # install the named routes in this session instance. klass = class << self; self; end #取到单例类 Routing::Routes.install_helpers(klass) #装载了命名路由 # the helpers are made protected by default--we make them public for # easier access during testing and troubleshooting. klass.module_eval { public *Routing::Routes.named_routes.helpers } #!!! @named_routes_configured = true
这样,在console中可以使用命名路由了,当然可以测试。例如:
>> app.login_path
=> "/login"
>> app.login_url
=> "http://www.example.com/login"
注意:
klass = class << self; self; end #注意这句与self.class的区别
klass.module_eval { public *Routing::Routes.named_routes.helpers } #这句真不赖
直接把命名路由弄成了共有方法,详细:
Routing::Routes.named_routes.helpers返回一个Array,*星号的作用是展开作为参数,而public正好接收这些参数,真是个好东西
>> ActionController::Routing::Routes.named_routes.helpers.class
=> Array
可以使用的方法4:属性方法
[RW] accept The Accept header to send.
[RW] application Rack application to use
[R] body The body of the last request.
[R] controller A reference to the controller instance used by the last request.
[R] cookies A map of the cookies returned by the last response, and which will be sent with the next request.
[R] headers A map of the headers returned by the last response.
[RW] host The hostname used in the last request.
[R] path The URI of the last request.
[RW] remote_addr The remote_addr used in the last request.
[R] request A reference to the request instance used by the last request.
[RW] request_count A running counter of the number of requests processed.
[R] response A reference to the response instance used by the last request.
[R] status The integer HTTP status code of the last request.
[R] status_message The status message that accompanied the status code of the last request.
例如:
?> app.path
=> "/login"
>> app.remote_addr
=> "127.0.0.1"
如何使用好这些属性和其提供的方法,还要看对每一个对象的了解。
可以使用的方法5: ActionController::Base引入的方法
[ControllerCapture, ActionController::ProcessWithTest].each do |mod| unless ActionController::Base < mod ActionController::Base.class_eval { include mod } end end
# A module used to extend ActionController::Base, so that integration tests # can capture the controller used to satisfy a request. module ControllerCapture #:nodoc: def self.included(base) base.extend(ClassMethods) base.class_eval do class << self alias_method_chain :new, :capture #重写方法,见下面【1】处调用 end end end module ClassMethods #:nodoc: mattr_accessor :last_instantiation def clear_last_instantiation! self.last_instantiation = nil end def new_with_capture(*args) controller = new_without_capture(*args) #这里调用了【1】 self.last_instantiation ||= controller #注意下这里!!! controller end end end
if @controller = ActionController::Base.last_instantiation @request = @controller.request @response = @controller.response @controller.send(:set_test_assigns) else # Decorate responses from Rack Middleware and Rails Metal # as an Response for the purposes of integration testing @response = Response.new @response.status = status.to_s @response.headers.replace(@headers) @response.body = @body end
module ProcessWithTest #:nodoc: def self.included(base) base.class_eval { attr_reader :assigns } end def process_with_test(*args) process(*args).tap { set_test_assigns } #这里用tap方法了 end private def set_test_assigns @assigns = {} (instance_variable_names - self.class.protected_instance_variables).each do |var| name, value = var[1..-1], instance_variable_get(var) @assigns[name] = value #主要作用就是设置可访问的assigns response.template.assigns[name] = value if response end end end
Yields x to the block, and then returns x. The primary purpose of this method is to “tap into” a method chain, in order to perform operations on intermediate results within the chain.
发表评论
-
Rails外如何启动rails的类自动加载_activates autoloading using ActiveSupport 3.x
2016-06-22 12:08 652The following cod ... -
Rails源码阅读(13)rails中的autoload和ruby的autoload
2014-07-30 17:13 1961Rails源码阅读(13)rails中的autoload和 ... -
Rails源码阅读(12)叫Rails的模块module_Rails常量使用
2014-07-02 09:35 1086The module nams "Rail ... -
Rails源码阅读(11)Rails使用bundle保持多机器环境gem版本的一致性
2013-09-05 19:21 1487Rails源码阅读(11)Rails使用bundle ... -
Rails源码阅读(九)ActionView::Base_用户请求在rails中的处理流程(4)
2012-04-08 18:19 2223Rails源码阅读(九)ActionView::Base_用户 ... -
Rails源码阅读(八)ActionController::Base_用户请求在rails中的处理流程(3)
2012-04-06 23:01 1747Rails源码阅读(八)Actio ... -
Rails源码阅读(七)ActionController::Dispatcher_用户请求在rails中的处理流程(2)
2012-04-06 22:25 1389Rails源码阅读(七)Actio ... -
动手写rails(二)Rails_Ruby_ERB使用_模板_定制
2012-04-07 20:46 2585动手写rails(二)Rails_Ruby_ERB使用_模板_ ... -
Rails源码阅读(六)ActionController::Dispatcher_用户请求在rails中的处理流程(1)
2012-03-28 00:17 1725Rails源码阅读(六)ActionController::D ... -
Rails源码阅读(零)_config/boot
2012-03-15 11:56 1800不论是script/console 还是 script/ser ... -
动手写rails(一)_Rack标准和HttpServer之WEBrick
2012-03-15 07:22 2111无论如何,最终的结果是要启动一个server来接受请求, ... -
Rails源码阅读(五)with_scope 和 named_scope
2012-02-02 15:24 1452Rails源码阅读(四)with_scope and name ... -
Rails源码阅读(四)gem_rubygems之require_Rails_require_深入理解(一)
2011-11-16 10:39 2143Rails源码阅读(四)rubygems之require_Ra ... -
Rails源码阅读(三)Rails::Initializer
2011-10-14 10:58 2181启动的落脚点 不论启动console还是启动serve ... -
Rails源码阅读(二)_script/server
2011-09-17 18:51 1456Rails源码阅读(二)_script/server ... -
Rails源码阅读(一)_script/console
2011-09-05 11:13 2152Rails源码阅读_script/console启动 ...
相关推荐
1. Rails 3.0: Rails 3是重大升级,引入了ActionController::Metal,这是一个轻量级的控制器,用于提高性能。同时,它引入了多路由引擎支持,如Rack中间件,使得与其他Web服务器的集成更加容易。此外,ActiveRecord...
《Rails Exporter 源码解析》 Rails Exporter 是一个用于 Rails 应用程序的开源工具,主要用于数据导出功能。源码分析将帮助我们深入理解其内部工作原理,以便更好地利用它来优化我们的应用。 一、Rails 框架基础 ...
Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...
Ruby on Rails,简称Rails,是基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,旨在使开发过程更加简洁高效。这个“ruby on rails 教程源码”很可能是为了辅助学习者深入理解Rails的...
使用 Rails 4 的简单聊天应用程序 - ActionController::Live 应用组件: 1 . 使用 Rails 4 ActionController::Live 的聊天应用程序 2 . 基本 LDAP 身份验证 3 . Redis 服务器集成 4 . 彪马服务器 1 . Rails 4 ...
安装将此行添加到应用程序的 Gemfile 中: gem 'rails_console_toolkit' 然后生成初始化程序: $ bin/rails generate rails_console_toolkit:install或手动编写: # config/initializers/console....
awesome_rails_console的优点是: 更少的宝石依赖关系(仅使用除prail-rails和awesome_print之外的rails。其余都是可选的) 更简单的提示修改(类似于你已经熟悉的默认提示) 无需担心配置(因为反正没有太多选择)...
awesome_rails_console, Rails 控制台增强使你的Rails 控制台更加出色 使你的Rails 控制台非常出色这个 gem 是由使用pry生产,jazz_hands和 jazz_fingers的激发 was 。awesome_rails_console的优点是:减少 gem ...
Rails的许多特性,如ActiveRecord(ORM)、ActiveModel、ActionController和ActionView,都是为了支持这种分层架构。 压缩包中的`seanatnci-rails_space-53c56b4`可能是一个具体的Rails项目仓库,包含以下关键组成...
Rails3 是 Ruby on Rails 框架的一个版本,它提供了一系列强大的命令行工具,使得开发者可以快速地构建和管理Web应用。在本文中,我们将深入探讨Rails3中的常用命令,帮助你更高效地进行开发工作。 首先,新建一个...
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
13. **测试(Testing)**:Rails 提供了全面的测试支持,包括单元测试(Test::Unit)、集成测试( ActionController::IntegrationTest)和行为驱动开发(RSpec)。 14. **配置(Configuration)**:Rails 应用可以...
在Rails中使用SSL(安全套接层)是构建Web应用时确保数据传输安全的重要步骤。Rails框架支持在应用程序中轻松集成SSL,以保护用户敏感信息,如登录凭据和支付详情。以下是一些关于在Rails中实施SSL的关键知识点: 1...
源码中的控制器文件演示了如何定义动作,以及如何使用before_action等回调来控制流程。 9. **Testing**: Rails提供了全面的测试框架,包括Unit Test、Integration Test和Feature Test。通过源码,我们可以了解如何...
在本篇内容中,我们将深入探讨如何利用Ruby on Rails(简称Rails)这一强大的Web应用程序框架来构建可伸缩且易于维护的RESTful API。Rails以其简洁优雅的语法、高效的开发速度以及良好的社区支持而闻名,这使得它...
《Rails 3 in Action》是2011年由Ryan Bigg撰写的一本关于Ruby on Rails框架的权威指南,专门针对当时最新的Rails 3.1版本进行了深入解析。这本书旨在帮助开发者充分利用Rails 3.1的强大功能,提升Web应用开发的效率...
11. **Rails Console**:提供了一个交互式的Ruby环境,便于开发者调试和实验代码。 12. **Rails API模式**:Rails 4引入了API模式,使得构建RESTful JSON接口变得更加简单。 13. **Webpacker和Webpack**:Rails ...
在“ruby on rails社区网站开发源码”中,我们可以学习到如何利用Rails构建一个互动性强、功能丰富的社区网站。以下是一些关键知识点: 1. **安装与环境设置**:首先,你需要安装Ruby和Rails。这通常涉及设置Ruby...
自动::会话::超时在Rails应用程序中提供自动会话超时。 非常容易安装和配置。... ActionController :: Base auto_session_timeout 1 . hourend 这将使用1个小时的全局超时。 gem假定您的身份验证提供程序具有#
在阅读这个博客后,读者可以学习到敏捷开发的原则,如迭代开发、持续集成以及如何在Rails框架中实现这些原则。 从给出的文件列表中,我们可以分析出Rails项目的典型结构: 1. **Rakefile**:这是Rails项目中的任务...