我有一张多步骤的入院表格.

我使用ession.id作为键,将每个步骤的数据存储在Rails.cache对象中.

def initialize_cache
  Rails.cache.fetch(session.id) { Hash.new }
end

def add_params_to_cache
  attrs = Rails.cache.read(session.id).merge(user_profile_params)
  Rails.cache.write(session.id, attrs)
end

这在开发模式下有效.

然而,我的测试失败了,因为会话.id为空.

我已经在test.rb环境文件中启用了缓存:

  config.action_controller.perform_caching = true
  config.cache_store = :memory_store

但是,我仍然不会对ession.id执行任何操作.

我发现的唯一糟糕的解决方案是在控制器中使用以下方法:

    def session_id
  @session_id ||= Rails.env.test? ? :test : session.id
end

有没有办法在Rails测试期间获得会话对象ID?

推荐答案

只有当你在会话中存储一些东西时,你才会得到session.id,否则它是nil.在第一个请求中,会话中还没有存储任何内容.在您的控制器操作完成之后,Rails存储_csrf_token和SOsession_id也被存储.只需带走:

<%= csrf_meta_tags %>

从您的布局和session.id将永远不会被初始化(除非您有其他更新会话).

会话ID是nothing特殊的,但您可能应该为此创建您自己的密钥:

# it's what session id is anyway
session[:cache_id] ||= SecureRandom.hex(16)

您还可以将某些内容保存到会话中,id将进行初始化:

# assuming there is no session
cookies.clear

session.id #=> nil

# any one of these will initialize session id
session.update({})
session.send(:load!)
session[:touch] = "poke"
# or this
session.destroy
session.clear

session.id #=> "cc3363adc0831258d3173f207a62dcae"

就测试而言,它只是向您显示session.id不是缓存ID的可靠来源.从一开始就把它固定在控制器上.

class HomeController < ApplicationController
  def index
    p "this does not initialize session.id"
    p Rails.cache.fetch(session.id) { Hash.new }
    p session.id # still nil
    p
    p "this will initialize session"
    p session.update({}) # or any other way mentioned above
    p Rails.cache.fetch(session.id) { Hash.new }
    p session.id
  end
end
$ bin/rails test test/controllers/home_controller_test.rb
Running 1 tests in a single process (parallelization threshold is 50)
Run options: --seed 48575

# Running:

"this does not initialize session.id"
{}
nil
"this will initialize session"
{"session_id"=>"39c1ee00e1e9214250d0bb6cfbfa68dc"}
{}
"39c1ee00e1e9214250d0bb6cfbfa68dc"
.

Finished in 0.294108s, 3.4001 runs/s, 3.4001 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips

这就像是第一次访问页面.try 在隐姓埋名窗口,session.id将是nil,但只是第一次访问.在测试中,它总是第一次访问.

Ruby-on-rails相关问答推荐

rails中Net::STP的多文件模式

在Ruby on Rails中获取堆栈级别太深错误(&Q)

我使用rbenv安装Ruby,但我在使用";gem";->;错误:执行gem时遇到此错误.(Errno::EACCES)权限被拒绝

方法和括号之间没有空格时出错

为什么 2 个关键字参数被解释为 1?

Ruby:如何通过谓词将一个集合拆分为 ruby​​ 中的两个集合?

如何在 Ruby on Rails 中正确存储 BigDecimal

Rails:如何访问 RESTful 助手?

从控制器中删除 Cookie

不带参数的 request.fullpath

具有 has_many 关联的 FactoryGirl build_stubbed 策略

.increment vs += 1

通过重定向使闪存哈希保持不变

批量查找 mongoDB 记录(使用 mongoid ruby​​ 适配器)

我收到在扫描下一个令牌时发现无法启动任何令牌的字符

使 rails 控制台输出更漂亮一点

Rails 3.1 Sprockets 需要指令 - 有没有办法排除特定文件?

Rails 控制台中手动更新属性值的验证问题

ActiveModel::MissingAttributeError:无法使用 FactoryGirl 写入未知属性ad_id

在 Ruby on Rails 中设置日志(log)记录级别