Ruby on rails 在rails中测试签名cookie

Ruby on rails 在rails中测试签名cookie,ruby-on-rails,cookies,Ruby On Rails,Cookies,我在Rails 3中使用签名cookie在应用程序中启用“记住我”功能。除了我无法对cookie进行功能测试外,其他一切都正常,因为比较cookies['memory_id']会得到加密的cookie,并且cookies.signed没有定义 有什么线索吗?问题(至少表面上)在于,在功能测试(ActionController::TestCase)的上下文中,“cookies”对象是一个散列,而当您使用控制器时,它是一个ActionDispatch::cookies::CookieJar对象。因此

我在Rails 3中使用签名cookie在应用程序中启用“记住我”功能。除了我无法对cookie进行功能测试外,其他一切都正常,因为比较
cookies['memory_id']
会得到加密的cookie,并且
cookies.signed
没有定义

有什么线索吗?

问题(至少表面上)在于,在功能测试(ActionController::TestCase)的上下文中,“cookies”对象是一个散列,而当您使用控制器时,它是一个ActionDispatch::cookies::CookieJar对象。因此,我们需要将其转换为CookieJar对象,这样我们就可以对其使用“signed”方法将其转换为SignedCookieJar

您可以(在get请求之后)将以下内容放入功能测试中,以将cookies从哈希转换为CookieJar对象

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

assert_equal@controller.send(:cookies).signed[:memory_id],匹配_value

这有点离题,但我在Rails 5中使用Rails 3解决方案时遇到问题,因为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\u cookies\u patch\u test.rb

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

我遇到了同样的问题,所以谢谢!我想知道是否有必要多次包含这两行代码,如果在同一测试中发出新的/秒请求,从而生成新的cookie?是否有可能将其转换为测试助手(使用cookies作为参数)?方法
merge在Rails 5中被弃用。Rails 5中的正确代码是什么?(如果我没有弄错的话,
merge
仍然可用)我感谢您的评论,但是发布一个“稍微偏离主题”的答案可能需要对该问题发表评论,而不是发布答案。:)我想这么做,但你必须有一个超过50的代表才能对别人的问题或答案发表评论。这是我的第一篇帖子,我不喜欢:)好电话,比尔。谢谢你的洞察力。