使用会话数据发送模拟环请求

时间:2018-01-19 11:31:11

标签: unit-testing session clojure ring

我正在尝试使用ring.mock.request使用“假”会话数据对铃声应用进行单元测试。但是看看documentation它似乎没有功能。

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

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

(def app
  (wrap-session routes))

在我的测试中:

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

但是我有点坚持在我的请求中添加这个'假'会话数据的位置(例如(ring.mock.request / request:get“/ transactions”:session {:username“foo”})

2 个答案:

答案 0 :(得分:1)

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

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

这个想法是准备这样一个cookie并在请求中传递它。但在这种情况下,你的测试不再是一个黑盒子,因为你操纵了一些不应该触及的内部东西,并且可能会发生变化。

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

另一个选择是在ring.middleware.session内部找到一个函数,用于添加和签署会话数据以进行响应。或者使用with-redef-fn重新定义其中一些,几乎相同。

在上面的链接上查看bare-session-request,主要逻辑在该函数中运行。

答案 1 :(得分:1)

您可以使用peridot。重要特征:

  

橄榄石旨在与 - >一起使用,并在线程中的请求中维护Cookie。

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

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

(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}}}}

请注意,在回复中,我们现在看到使用会话密钥:body "Hello Roberto"构建的:username