ruby-on-rails 如何在测试期间为Rails应用启用Rails.cache会话对象

bq9c1y66  于 2023-01-14  发布在  Ruby
关注(0)|答案(1)|浏览(90)

bounty将在6天后过期。回答此问题可获得+100声望奖励。chell希望引起更多人关注此问题。

我有一个多步骤的接收表。
我使用www.example.com作为键将每个步骤的数据存储在Rails.cache对象中session.id。

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

这在开发模式下有效。
但是,我的测试失败了,因为session.id为空。
我已经在test.rb环境文件中启用了缓存:

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

但是,对于session.id,我仍然得到零。
我发现的唯一糟糕的解决方案是在控制器中使用以下方法:

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

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

lg40wkob

lg40wkob1#

只有当你在session中存储了一些东西时,你才会得到session.id,否则它就是nil。在第一次请求时,session中还没有存储任何东西。当你的控制器操作完成后,rails存储_csrf_token,所以session_id也被存储了。

<%= csrf_meta_tags %>

从你的布局和session.id将永远不会被初始化(除非你有其他东西更新会话)。
会话id没有什么特别的,但您可能应该为此创建自己的密钥:

# 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的可靠来源。从一开始就在控制器中修复它。

相关问题