2011-02-23 39 views
4

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

任何线索?

回答

6

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

你可以把下面的内容功能测试(GET请求后),以饼干从哈希转换为CookieJar对象

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

令人惊叹!那就是诀窍。谢谢! – Ian 2011-03-04 02:43:19

+0

我遇到了同样的问题,谢谢!我想知道是否有必要多次包含这两行,如果在同一个测试中发出了新的/秒的请求,从而产生新的cookie?是否有可能把它变成一个测试助手(以cookies作为参数)? – Nick 2016-01-23 17:00:05

+0

“合并!”方法在Rails 5中已弃用。Rails 5中的正确代码是什么? (如果我没有错误'合并'仍然可用) – Marty 2016-07-06 16:22:58

-2

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

0

这有些偏离主题,但是我无法使Rails 3解决方案在Rails 5中工作,因为ActionDispatch :: Cookies :: CookieJar.build已更改。这样做的诀窍:

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

我很感谢您的评论,但发布一个“稍微偏离主题”的答案可能需要对问题发表评论,而不是发布答案。 :) – benhorgen 2016-07-21 19:13:06

+1

我想,但你必须有一个代表> 50来评论别人的问题或答案。我不这样做,因为它是我的第一篇文章:) – Bill 2016-07-21 19:34:14

+0

好电话比尔。感谢您的洞察力。 – benhorgen 2016-07-21 19:57:13