【问题标题】:Testing signed cookies in rails在 Rails 中测试签名的 cookie
【发布时间】:2011-07-03 02:19:52
【问题描述】:

我在 Rails 3 中使用签名 cookie 来启用应用程序中的“记住我”功能。一切正常,除了我无法对 cookie 进行功能测试,因为比较 cookies['remember_id'] 给了我加密的 cookie,而 cookies.signed 没有定义。

有什么线索吗?

【问题讨论】:

    标签: ruby-on-rails cookies


    【解决方案1】:

    问题(至少在表面上)是在功能测试(ActionController::TestCase)的上下文中,“cookies”对象是一个哈希,而当您使用控制器时,它是一个 ActionDispatch:: Cookies::CookieJar 对象。所以我们需要把它转换成一个CookieJar对象,这样我们就可以使用它上面的“签名”方法把它转换成一个SignedCookieJar。

    您可以将以下内容放入您的功能测试中(在获取请求之后),以将 Cookie 从 Hash 转换为 CookieJar 对象

    @request.cookies.merge!(cookies)
    cookies = ActionDispatch::Cookies::CookieJar.build(@request)
    

    【讨论】:

    • 我遇到了同样的问题,谢谢!我想知道是否有必要多次包含这两行,如果在同一个测试中发出新的/第二个请求从而生成新的 cookie?能不能把它变成一个测试助手(以cookies为参数)?
    • Rails 5 中不推荐使用 merge! 方法。Rails 5 中的正确代码是什么? (如果我没记错的话merge 仍然可用)
    【解决方案2】:

    这有点跑题了,但我无法让 Rails 3 解决方案在 Rails 5 中工作,因为 ActionDispatch::Cookies::CookieJar.build 已更改。这成功了:

    jar = ActionDispatch::Cookies::CookieJar.build(@request, cookies.to_hash)
    assert_equal jar.signed['remember_token'], ...
    

    【讨论】:

    • 感谢您的评论,但发布“略微偏离主题”的答案可能需要对问题发表评论而不是发布答案。 :)
    • 我想,但你必须有一个 > 50 的代表才能评论别人的问题或答案。我不这样做,因为这是我的第一篇文章:)
    • 好电话比尔。感谢您的洞察力。
    【解决方案3】:

    这会将所有加密和签名的 cookie 转换为测试环境的常规 cookie。只需确保您没有带有 secure 属性的 cookie(不起作用)

    config/initializers/signed_cookies_patch_test.rb:

    if Rails.env.test?
      class ActionDispatch::Cookies::CookieJar
        def encrypted; self; end
        def signed; self; end
      end
    end
    

    【讨论】:

      【解决方案4】:

      assert_equal @controller.send(:cookies).signed[:remember_id], matching_value

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-28
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        相关资源
        最近更新 更多