Rails版本:5.1.1,从4.2.7升级
我有一个集成测试(从ActionDispatch :: IntegrationTest开始),它会访问URL。该URL的控制器将一些内容放入会话中。然后,测试尝试断言会话中现在存在某些值。
我的session_store.rb:
Rails.application.config.session_store :cookie_store, key: '_companySite_session', expire_after: 1.year
我发现会话变量从集成测试调用为'session',总是一个空哈希({})。
如果我在测试中查看request.host,我会看到“www.example.com”。如果我查看response.cookies或cookies,我会看到:
#<Rack::Test::Cookie:0x00000006037108
@default_host="www.example.com",
@name="_companySite_session",
@name_value_raw=
"_companySite_session=a3RnYjRvWDlUYzRZaVlaTnlsK2RkeXBWcWFNYnQ1RVo4azNqdXNOanVWWWZVT2o5Vk0wTkVhY1dFOTBxdWNzMU5sY3c1cXhXRm0xT3JZWWZGUnluSnRuYTVoaWQ1S3ZZRXVMa1YyQ2pUMjEvOExaWkcybTdGT3lUZnZ0STRSSGVpc0dPU1VONWNwTEZxQlRvODN3eXdKZTYreVIvNDR4Y0IxMms2djlPWUZCcktYWmo1SElSZ0ttaHA5UWk5MDA5aVJzaGt3cUJ4V2tFY295ZGo4ak8ydUI3OWRnTUdkcmRpanVML3phalJtZ2c1OXByeExiRDhlcy9rR1RYUGh6NlkxV2xqNWl2VjlCMm45WXo0ajBKN0VTQ29CVGRQRVErOVIrNFZwdEZBc01oL2RaSGltUjdleGlWN3YySTdJUzcvbVlJbWdwWVNUVkw4K1pPc3JsUWxOR1BZNFVrUXFtYVVObmNlYlZrSklEbk5aU3VTck5MNm12a0NBMVF2aG5xLS1pSEJTVTVLZzJ2ZVA2M1IzTmJ4Njh3PT0%3D--f253c4e1678e53896a247b087e741cf006c5874f",
@options={"path"=>"/", "expires"=>"Fri, 08 Jun 2018 19:46:22 -0000", "HttpOnly"=>nil, "domain"=>"www.example.com"},
@value=
"a3RnYjRvWDlUYzRZaVlaTnlsK2RkeXBWcWFNYnQ1RVo4azNqdXNOanVWWWZVT2o5Vk0wTkVhY1dFOTBxdWNzMU5sY3c1cXhXRm0xT3JZWWZGUnluSnRuYTVoaWQ1S3ZZRXVMa1YyQ2pUMjEvOExaWkcybTdGT3lUZnZ0STRSSGVpc0dPU1VONWNwTEZxQlRvODN3eXdKZTYreVIvNDR4Y0IxMms2djlPWUZCcktYWmo1SElSZ0ttaHA5UWk5MDA5aVJzaGt3cUJ4V2tFY295ZGo4ak8ydUI3OWRnTUdkcmRpanVML3phalJtZ2c1OXByeExiRDhlcy9rR1RYUGh6NlkxV2xqNWl2VjlCMm45WXo0ajBKN0VTQ29CVGRQRVErOVIrNFZwdEZBc01oL2RaSGltUjdleGlWN3YySTdJUzcvbVlJbWdwWVNUVkw4K1pPc3JsUWxOR1BZNFVrUXFtYVVObmNlYlZrSklEbk5aU3VTck5MNm12a0NBMVF2aG5xLS1pSEJTVTVLZzJ2ZVA2M1IzTmJ4Njh3PT0=--f253c4e1678e53896a247b087e741cf006c5874f">
换句话说,会话cookie似乎存在,并且其域似乎与请求的主机匹配。我还使用了How to decrypt a Rails 5 session cookie manually?中的代码来打印出这个cookie的值,并且值是正确的。
我的测试环境的配置指定config.action_controller.allow_forgery_protection = false
在这一点上,我没有想法。 cookie在那里,看起来很好,它设置为请求的域,它没有过期,但会话仍然是一个空哈希。是不是以某种方式得到更新?它是在尝试更新但是却默默地失败了吗?我已经没有什么可试的了。
此测试在Rails 4.2.7下正常工作。
虽然我没有完全潜入它,但我也发现测试的flash变量似乎总是空的。再次,在Rails 4中运行良好的测试正在破坏,因为闪存似乎总是空的。我假设闪存和会话是相关的,所以可能同样的问题会影响它们。
答案 0 :(得分:0)
解决方案是我们在test.rb环境文件中有这个设置:
config.allow_concurrency = false
出于某种原因,在测试中发出请求后,此设置会导致会话被替换为空哈希。 Rails的文档建议您不要直接设置此标记:http://guides.rubyonrails.org/v3.2/configuring.html。
我认为这是我们在Rails 2中设置的内容,然后在升级时被带入Rails 4,现在在Rails 5中打破。
我已将其记录为Rails仓库中的问题:https://github.com/rails/rails/issues/29608