2013-12-11 59 views
2

我寫了一個clojure webapp,看起來非常像 示例webapp as the friend exmaple。我有 使用ring-mock寫一點測試來測試驗證 是否正常工作。寫這個測試我發現了一些我不明白的行爲。Compojure和Friend在這個例子中,狀態是

以下面的代碼爲例。

(let [route "/login" 
     login-post (body (request :post route) 
         {"username" "Username" "password" "Password"})] 
    (println (secured-app login-post)) 
    (println (secured-app login-post))) 

第一println返回正確的結果:

{:status 303, 
:headers 
{"Set-Cookie" 
    ("ring-session=ENCRYPTED-STUFF;Path=/"), 
    "Location" "/"}, 
:body ""} 

但是第二個返回一個登錄錯誤:

{:status 302, 
:headers 
{"Location" "http://localhost/login?&login_failed=Y&username="}, 
:body ""} 

某處在這個代碼存在從被「發送」狀態第一個 請求被處理到第二個請求(secured-app login-post),但我沒有看到它。

當我如運行此聲明:

(println (secured-app(body (request :post "/login") 
          {"username" "Username" "password" "Password"}))) 
在REPL多次

,我總是第一個正確的結果。

這種行爲來自哪裏,在這個例子中,國家在哪裏?

+0

我做了一個小的庫來存儲/重新創建請求,請求的主體是一個流所期望的環:https://github.com/noisesmith/groundhog它可以作爲一個環處理程序添加,以捕獲請求當他們進來時 – noisesmith

回答

3

ring.mock.request/body函數將給定的主體數據轉換爲可變的ByteArrayInputStream。這意味着,通常情況下,一旦您的請求已通過應用程序,正文流已被讀取(通常由ring.middleware.params/assoc-form-params,它在請求正文上調用slurp),現在是空的。換句話說,如果您使用ring-mock測試響鈴應用程序,則不應該重複請求和正文。最好總是創建一個新的請求。