我正在试图找出如何单元测试一个方法,该方法从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-store是空的,即使我看到在处理程序函数中设置了cookie。
我做错了什么?
发布于 2014-11-03 10:45:09
你没做错什么。问题是cookie存储操作是在Http.core/请求内部执行的(由底层java库完成),而clj-http.fid所做的是模拟版本的取代这一职能,因此操作cookie存储的java代码永远不会执行。
我的建议是:
res应该有一个包含所有cookie的映射的:cookie条目,所以只需使用它,而不是创建和使用显式cookie存储。Cookie存储用于向同一台服务器发出几个请求,而不必担心在每个后续请求中设置Cookie。从示例代码来看,您似乎不需要cookie商店。https://stackoverflow.com/questions/26710934
复制相似问题