2014-11-03 45 views
1

我想弄清楚如何單元測試一個方法,從cookie存儲中檢索一個cookie並將其存儲以備後用。用clj-http.fake在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是空的,即使我看到了餅乾的處理功能被設置。

我在做什麼錯?

回答

1

你沒有做錯什麼。問題在於cookie存儲操作是在clj_http.core/request(由底層java庫)內部完成的,clj-http.fake由嘲笑版本做的是replace that function,所以操縱cookie存儲的java代碼永遠不會執行。

我的建議是:

  1. res應該有:與所有的餅乾地圖餅乾入口,所以才用這個來代替創建和使用一個明確的餅乾店。 Cookie存儲用於向同一服務器發出多個請求,而不用擔心在每個後續請求中設置Cookie。從示例代碼中,您似乎不需要cookie存儲。

  2. 如果你真的需要一個cookie存儲,你將需要自己模擬java lib的行爲。在你的測試中可能設置的custom middleware可能會訣竅。

+0

你,先生,是正確的! #1它是。 – 2014-11-03 12:10:04