发送带有会话数据的模拟响铃请求

Rob*_*des 4 session unit-testing clojure ring

我正在尝试使用ring.mock.request使用“假”会话数据对环应用程序进行单元测试。但查看其文档似乎没有该功能。

在真正的应用程序中,我使用ring.middleware.session包装器:

(defroutes routes
  (GET "/transactions"  [{session :session}]
    (response (str "Hello " (:username session)))))

(def app
  (wrap-session routes))
Run Code Online (Sandbox Code Playgroud)

在我的测试中:

(app (ring.mock.request/request :get "/transactions"))
Run Code Online (Sandbox Code Playgroud)

但我有点困惑在哪里为我的请求添加这个“假”会话数据(例如(ring.mock.request/request :get "/transactions" :session {:username "foo"})。

Tay*_*ood 5

您可以为此使用橄榄石。重要特点:

peridot 设计为与 -> 一起使用,并在线程中跨请求维护 cookie。

(-> (peri/session app)
    (peri/request "/session-setter") ;; this would be the route that *sets* the session value
    (peri/request "/transactions"))
Run Code Online (Sandbox Code Playgroud)

/session-setter我添加的路线在哪里,只是为了在您的会话中设置一个值:

(GET "/session-setter" []
  {:status 200
   :body "OK"
   :session {:username "Roberto"}})
Run Code Online (Sandbox Code Playgroud)

最终你应该得到一个像这样的地图(为了简洁起见,我删除了一些键):

{:response {:status 200,
            :headers {...},
            :body "Hello Roberto"},
 :request {...},
 :cookie-jar {"localhost" {"ring-session" {:value "04110b66-1281-4e88-9470-546911e21ca1",
                                           :path "/",
                                           :domain "localhost",
                                           :raw "ring-session=04110b66-1281-4e88-9470-546911e21ca1",
                                           :http-only true}}}}
Run Code Online (Sandbox Code Playgroud)

请注意,在响应中,我们现在看到:body "Hello Roberto"哪个是使用会话密钥构建的:username