我正在试图弄清楚如何对从cookie存储中检索cookie的方法进行单元测试并存储它以供进一步使用。
(defn update-rb-session-id
[]
(hiccup.util/with-base-url @rb-url
(log/info "Updating RB session...")
(let [url (hiccup.util/url "/api/review-requests/")
cs (cookies/cookie-store)
res (client/get (hiccup.util/to-str url)
{:content-type :json
:cookie-store cs
:basic-auth [@rb-user @rb-password]
:as :json})]
(log/info "response: " res)
(log/info "cookie store: " (cookies/get-cookies cs))
(let [sid (:value (get (cookies/get-cookies cs) "rbsessionid"))]
(reset! rb-session-id sid)))))
我的测试看起来像这样
(facts "ReviewBoard"
((with-fake-routes-in-isolation {
"https://my.reviewboard.com/api/review-requests/"
(fn [request] {:status 200
:headers {
"content-type" "text/json"
"set-cookie" "rbsessionid=testsessionid;Path=/"}
:body "{\"review_requests\": []}"})}
(with-redefs [slack-nag.reviewboard/rb-url (delay "https://my.reviewboard.com/")
slack-nag.reviewboard/rb-user (delay "test-user")
slack-nag.reviewboard/rb-password (delay "test-password")]
(fact "it updates rb-session-id atom"
(do
(update-rb-session-id)
(= rb-session-id "testsessionid")) => truthy)))))
然而,即使我看到在处理函数中设置了cookie,我的cookie-store
也是空的。
我做错了什么?
答案 0 :(得分:1)
你没有做错任何事。问题是cookie存储操作是在clj_http.core/request内部(由底层的java libs)完成的,clj-http.fake所做的是replace that function所做的模拟版本,所以java代码是操纵cookie存储永远不会被执行。
我的建议是:
res
应该有一个:带有所有Cookie的地图的Cookie条目,所以只需使用它而不是创建和使用显式的cookie存储。 Cookie存储用于向同一服务器发出多个请求,而不必担心在每个后续请求中设置cookie。从示例代码中,您似乎不需要cookie存储。
如果你真的需要一个cookie商店,你需要自己模拟java lib的行为。可能会在你的测试中设置custom middleware就可以了。