2011-02-23 72 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