【发布时间】:2011-07-03 02:19:52
【问题描述】:
我在 Rails 3 中使用签名 cookie 来启用应用程序中的“记住我”功能。一切正常,除了我无法对 cookie 进行功能测试,因为比较 cookies['remember_id'] 给了我加密的 cookie,而 cookies.signed 没有定义。
有什么线索吗?
【问题讨论】:
标签: ruby-on-rails cookies
我在 Rails 3 中使用签名 cookie 来启用应用程序中的“记住我”功能。一切正常,除了我无法对 cookie 进行功能测试,因为比较 cookies['remember_id'] 给了我加密的 cookie,而 cookies.signed 没有定义。
有什么线索吗?
【问题讨论】:
标签: ruby-on-rails cookies
问题(至少在表面上)是在功能测试(ActionController::TestCase)的上下文中,“cookies”对象是一个哈希,而当您使用控制器时,它是一个 ActionDispatch:: Cookies::CookieJar 对象。所以我们需要把它转换成一个CookieJar对象,这样我们就可以使用它上面的“签名”方法把它转换成一个SignedCookieJar。
您可以将以下内容放入您的功能测试中(在获取请求之后),以将 Cookie 从 Hash 转换为 CookieJar 对象
@request.cookies.merge!(cookies)
cookies = ActionDispatch::Cookies::CookieJar.build(@request)
【讨论】:
merge! 方法。Rails 5 中的正确代码是什么? (如果我没记错的话merge 仍然可用)
这有点跑题了,但我无法让 Rails 3 解决方案在 Rails 5 中工作,因为 ActionDispatch::Cookies::CookieJar.build 已更改。这成功了:
jar = ActionDispatch::Cookies::CookieJar.build(@request, cookies.to_hash)
assert_equal jar.signed['remember_token'], ...
【讨论】:
这会将所有加密和签名的 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
【讨论】:
assert_equal @controller.send(:cookies).signed[:remember_id], matching_value
【讨论】: