【问题标题】:Integration Test Session not loading Session Cookie集成测试会话未加载会话 Cookie
【发布时间】:2017-11-10 16:34:14
【问题描述】:

Rails 版本:5.1.1,从 4.2.7 升级

我有一个命中 URL 的集成测试(继承自 ActionDispatch::IntegrationTest)。该 URL 上的控制器将一些内容放入会话中。然后测试尝试断言会话中现在存在某些值。

我的 session_store.rb:

Rails.application.config.session_store :cookie_store, key: '_companySite_session', expire_after: 1.year

我发现从集成测试中称为“会话”的会话变量始终是一个空哈希 ({})。

如果我在测试中查看 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 在那里,看起来很好,它设置为请求的域,它没有过期,但 session 仍然是一个空的哈希。它没有以某种方式更新吗?它是否试图更新但默默地失败?我已经没有东西可以尝试了。

此测试在 Rails 4.2.7 下运行良好。

虽然我还没有完全深入研究它,但我也发现测试的 flash 变量似乎也总是空的。同样,在 Rails 4 中运行良好的测试正在中断,因为闪存似乎总是空的。我假设 flash 和 session 是相关的,所以也许同一个问题会影响它们。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5


    【解决方案1】:

    解决方案是我们在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2017-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      相关资源
      最近更新 更多