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?
1条答案
按热度按时间lg40wkob1#
只有当你在session中存储了一些东西时,你才会得到
session.id
,否则它就是nil
。在第一次请求时,session中还没有存储任何东西。当你的控制器操作完成后,rails存储_csrf_token
,所以session_id
也被存储了。从你的布局和
session.id
将永远不会被初始化(除非你有其他东西更新会话)。会话id没有什么特别的,但您可能应该为此创建自己的密钥:
您也可以将某些内容保存到会话中,
id
将初始化:就测试而言,它只是向您显示
session.id
不是缓存ID的可靠来源。从一开始就在控制器中修复它。