`
xf986321
  • 浏览: 163976 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Rails Cookie测试

阅读更多

Rails Cookie测试

如果你在某个action中对Cookie进行了设置,然后你又打算对你设置的cookie进行测试,那么你可能会遇到麻烦,不妨看看下面这段代码:

class CookiesController
  def update
    cookies[:name] = 'demo'
  end
end
describe CookiesController
  it "should update cookies[:name] to 'demo'" do
    request.cookies[:name] = 'test'
    put :update
    request.cookies[:name].should == 'demo'
  end
end

如果你运行上面的测试,将会得到一个:expected ‘demo’ got ‘test’,这是怎么回事,cookie设置失败了?实际上这是正确的,之所以产生这样的结果是因为我们对Rails的Cookie机制不了解,首先我 们需要区分request.cookies和Controller中的cookies,request.cookies是用于模拟客户端发送的 cookie的,它是一个Hash对象,因此我们可以像使用hash那样使用它:

>> request.cookies[:name] = ‘test’
>> request.cookies[:name]
test

但是Controller中的cookies则不同,它是一个ActionController::CookieJar对象,这个cookies对 象实际上保存了2个cookie集合:incoming cookie和outgoing cookie。incoming cookie就是客户请求中所携带的cookie(也就是request.cookies),而outgoing cookie则是在请求处理完后将被设置回客户端的cookie。

因此尽管我们使用了[]=方法来设置cookie,但因为cookies对象重载了[]与[]=方法:

  1. []方法返回的是incoming cookie,也就是request中携带的cookie
  2. 而[]=方法设置的却是outgoing cookie,它只对下一个请求起作用,也就是说它会被包含在下一个请求的incoming cookie中。

因此设置controller cookies,我们只能得到:

>> cookies[:name] = ‘test’
>> cookies[:name]
nil

如果你需要测试cookies是否设置成功,那么一个简单的方法,就是将controller中的cookies替换成一个hash,比如:


describe CookiesController
  it "should update cookies[:name] to 'demo'" do
    request.cookies[:name] = 'test'
    @cookies = {}
    controller.stub!(:cookies).and_return(@cookies)
    put :update
    @cookies[:name].should == 'demo'
  end
end

分享到:
评论

相关推荐

    Ruby-Rails的AB测试

    在Ruby on Rails框架中,A/B测试是一种非常重要的实践,用于评估和优化网站或应用程序的用户体验和性能。A/B测试,也称为分组测试或对照实验,是将用户随机分配到两个或更多版本(变体)的同一产品或功能中,以比较...

    rails 项目起步示例

    2. **bin**:存放可执行文件,如`rails`脚本,用于启动服务器、运行测试等。 3. **config**:配置文件的集合,包括数据库连接、路由设置、应用环境等。 4. **db**:数据库相关的文件,如迁移(migrations)用于...

    Rails 4 in Action, Second Edition.pdf

    - **Secure Cookies**:为了提高安全性,Rails 4引入了一种新的安全cookie机制,可以更好地保护用户的会话数据。 - **Asset Pipeline的优化**:Rails 4对Asset Pipeline进行了改进,使得前端资源的管理更加简便。 - ...

    Ruby on Rails中文指南

    11. **测试(Testing)**:Rails鼓励TDD(Test-Driven Development),提供了丰富的测试工具,如RSpec、Cucumber和MiniTest,确保代码的质量和可靠性。 12. **生成器(Generators)**:Rails的生成器可以帮助快速...

    Rails 3 in Action

    书中第二章提到 **测试驱动开发(TDD)** 和 **行为驱动开发(BDD)**,这两种方法是 Rails 社区广泛采用的测试策略。 - **测试驱动开发(TDD)**: - 测试先行:先编写测试用例,再编写满足这些测试的代码。 - 循环...

    基于Ruby On Rails的在线购书系统

    《基于Ruby On Rails的在线购书系统》是一个深入探讨如何利用Ruby on Rails框架构建电子商务平台的项目。Ruby on Rails(RoR)是一个开源的Web应用框架,它遵循MVC(模型-视图-控制器)架构模式,以Ruby编程语言为...

    plug_rails_cookie_session_store:与Rails兼容的插件会话存储

    从压缩包的文件名称"plug_rails_cookie_session_store-master"来看,这很可能是该插件的源代码仓库主分支的克隆,可能包含了项目的README、配置文件、源代码以及测试等相关文件。 在实际应用中,使用`plug_rails_...

    Ruby on Rails 3.2 Tutorial

    7. **会话和cookies**:讲解如何使用Rails的session和cookie机制来管理用户状态。 8. **表单和链接**:介绍如何创建HTML表单以及使用Rails的辅助方法创建链接,实现用户交互。 9. **部署**:讲解如何将应用程序...

    关于Rails登录和验证插件http_authentication restful-authentication

    当用户成功登录后,会话ID会被存储在用户的cookie中,服务器根据这个ID识别用户,从而实现会话持久化。 2. **哈希和加密**: 为了保护用户密码,它们在存储前通常会先进行哈希和加盐处理。Rails提供了BCrypt或SHA...

    使用 rails进行敏捷开发(第三版)

    Rails的许多设计原则和工具都直接支持这种敏捷工作流程,如自动化测试、DHH(David Heinemeier Hansson)提出的"约定优于配置"原则以及强大的开发工具如Rails console和Rails generator。 本书的英文版可能包含以下...

    Pragmatic.Security.on.Rails.Dec.2009.rar

    7. **安全设置与配置**:Rails的默认配置在很多方面都有助于安全性,但开发者仍需了解如何根据项目需求调整这些设置,例如调整session存储方式、启用HTTP-only cookie、配置SSL等。 8. **更新与维护**:保持Rails...

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    22.2 Cookie和Session 354 22.3 Flash——Action之间的通信 364 22.4 过滤器与校验 366 22.5 缓存初接触 372 22.6 GET请求的问题 378 第23章 Action View 381 23.1 模板 381 23.2 使用辅助方法 385 23.3 用于格式化...

    rails-json-api:准系统、无状态、RESTFUL Rails JSON API 服务器

    无状态 JSON API - 没有不安全的会话或 cookie,因此不需要 CSRF 令牌 作为我们的并发 Web 服务器 用于我们的数据存储 UUID 作为用户的主键 ( ) 用于后台处理(使用 ) 所有电子邮件都通过 ActiveJob + Resque ...

    simple_split:在Rails上进行简单的AB测试

    simple_split –在Rails上进行简单的A / B测试 simple_split gem为通过Rails进行拆分测试提供了绝对最简单的接口,同时仍提供了一组表达性强的工具来编写和维护实验。 更传统的解决方案(例如提供了更多的优势,但...

    railstutorial_sample

    7. **测试(Test)**:Rails鼓励TDD(测试驱动开发),在`test`目录下包含了针对模型、控制器和功能的测试。使用RSpec或Test::Unit进行测试,确保代码质量。 8. **JavaScript**:虽然标签中提及JavaScript,Rails默认...

    pretender, 在 Rails 中作为另一个用户登录.zip

    在 Rails 应用程序中,通常用户的登录状态是通过 session 或者 cookie 来维护的。当用户登录后,这些信息会被存储,然后在后续请求中用来验证用户身份。然而,如果想以管理员的身份查看并模拟另一个用户的行为,传统...

    rsepc-rails-cookies错误

    产生跑步 rails new rspec-rails-cookies-bug --skip-action-mailer --skip-action-mailbox --skip-action-text --skip-active-record --skip-active-...但是通过Rails控制器测试运行它就可以了 bundle exec rails test

    Ruby-Split基于Rack的AB测试框架

    Split框架充分利用了Rack的特性,将A/B测试的逻辑无缝地集成到Ruby on Rails或其他Rack兼容的应用中。 首先,让我们深入了解一下什么是A/B测试。A/B测试是一种统计方法,用于比较两种或多种变体(如网页设计、营销...

    micro-reddit:这是使用Ruby on Rails构建的reddit的简单版本

    - Rails鼓励TDD(测试驱动开发),项目中应包含各种测试,如RSpec用于业务逻辑测试,Capybara用于集成测试,确保功能正确运行。 7. **部署**: - 项目完成后,通常会将其部署到如Heroku或DigitalOcean这样的...

    cookie-based-guests:基于cookie的方法,用于在Rails应用程序中实现访客用户

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明… 如果您不打算运行rake doc:app请随意使用其他标记语言。

Global site tag (gtag.js) - Google Analytics