使用clj-http.fake在cookie商店中模拟cookie?

时间:2014-11-03 09:08:34

标签: unit-testing cookies clojure

我正在试图弄清楚如何对从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也是空的。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你没有做错任何事。问题是cookie存储操作是在clj_http.core/request内部(由底层的java libs)完成的,clj-http.fake所做的是replace that function所做的模拟版本,所以java代码是操纵cookie存储永远不会被执行。

我的建议是:

  1. res应该有一个:带有所有Cookie的地图的Cookie条目,所以只需使用它而不是创建和使用显式的cookie存储。 Cookie存储用于向同一服务器发出多个请求,而不必担心在每个后续请求中设置cookie。从示例代码中,您似乎不需要cookie存储。

  2. 如果你真的需要一个cookie商店,你需要自己模拟java lib的行为。可能会在你的测试中设置custom middleware就可以了。