【问题标题】:Sending a mock ring request with session data发送带有会话数据的模拟环请求
【发布时间】:2018-01-19 11:31:11
【问题描述】:

我正在尝试使用 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"}) .

【问题讨论】:

    标签: unit-testing session clojure ring


    【解决方案1】:

    您可以为此使用peridot。重要特点:

    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 构建的。

    【讨论】:

      【解决方案2】:

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

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

      这个想法是准备这样一个cookie并在请求中传递它。但在这种情况下,您的测试不再是一个黑盒,因为您使用了一些不应触及且可能会更改的内部内容。

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

      另一种选择是在ring.middleware.sessionguts 中找到一个函数,该函数添加和签署会话数据以响应。或者使用with-redef-fn重新定义其中一些,几乎是一样的。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-20
        • 2019-07-02
        • 1970-01-01
        • 2020-05-24
        • 2021-06-03
        • 2011-12-29
        • 2020-09-10
        相关资源
        最近更新 更多