Unit testing 发送带有会话数据的模拟环请求

Unit testing 发送带有会话数据的模拟环请求,unit-testing,session,clojure,ring,Unit Testing,Session,Clojure,Ring,我正在尝试使用“假”会话数据对一个ring应用程序进行单元测试。但从它的功能上看,它似乎没有这个功能 在真正的应用程序中,我使用的是包装器: 在我的测试中: (app (ring.mock.request/request :get "/transactions")) 但是我有点纠结于在哪里为我的请求添加这个“假”会话数据(例如类似于(ring.mock.request/request:get”/transactions:session{:username“foo”})。在模拟库中没有提供会话数

我正在尝试使用“假”会话数据对一个ring应用程序进行单元测试。但从它的功能上看,它似乎没有这个功能

在真正的应用程序中,我使用的是包装器:

在我的测试中:

(app (ring.mock.request/request :get "/transactions"))

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

在模拟库中没有提供会话数据的选项,因为它取决于服务器部分,而不是请求本身

当会话中间件处理请求时,它读取表示使用密钥签名的会话数据的cookie

我们的想法是准备这样一个cookie,并在请求中传递它。但是在这种情况下,您的测试不再是一个黑盒子,因为您使用一些不应该被触摸的内部内容进行操作,并且可能会发生更改

一种选择是,只有在运行添加需要进一步处理的会话数据的测试时,才可以使用特殊处理程序。在测试中,您会执行两个请求:第一个请求用于该处理程序,第二个请求用于普通处理程序,但会传递第一个请求返回的cookie。这是最现实的情况

另一种选择是在guts中找到一个函数,该函数添加会话数据并对其进行签名以响应。或者使用redef fn重新定义其中的一些函数,这几乎是相同的

查看上面链接上的
裸会话请求
,主逻辑在该函数中运行。

您可以使用它。重要功能:

peridot设计用于->并在线程中跨请求维护cookie

其中,
/sessionsetter
是我添加的一个路由,只是为了在会话中设置一个值:

(GET "/session-setter" []
  {:status 200
   :body "OK"
   :session {:username "Roberto"}})
最终,您应该得到这样的地图(为了简洁起见,我删除了一些键):

请注意,在响应中,我们现在看到了
:body“Hello Roberto”
,它是使用会话键
:username
构建的

(-> (peri/session app)
    (peri/request "/session-setter") ;; this would be the route that *sets* the session value
    (peri/request "/transactions"))
(GET "/session-setter" []
  {:status 200
   :body "OK"
   :session {:username "Roberto"}})
{: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}}}}