You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ring.mock.request为Ring应用单元测试添加模拟会话数据

解决Ring应用测试中模拟会话数据的问题

我之前也碰到过这个情况!ring.mock.request确实没有提供直接设置会话的参数,但它生成的请求本质上就是一个普通的Clojure map,所以我们可以手动给这个map添加:session键值对,让wrap-session中间件能识别并使用它。

直接修改请求map

最简单的方式就是用assoc或者merge把会话数据加到请求里:

;; 使用assoc添加会话
(app (assoc (ring.mock.request/request :get "/transactions")
            :session {:username "foo"}))

;; 或者用merge更直观
(app (merge (ring.mock.request/request :get "/transactions")
            {:session {:username "foo"}}))

封装成辅助函数(可选)

如果需要多次测试不同的会话场景,可以封装一个辅助函数来简化操作:

(defn request-with-session [method url session-data]
  (merge (ring.mock.request/request method url)
         {:session session-data}))

;; 使用示例
(app (request-with-session :get "/transactions" {:username "foo"}))
(app (request-with-session :get "/transactions" {:username "bar"}))

为什么这能生效?

ring.middleware.session/wrap-session中间件的工作逻辑就是从请求map中读取:session字段的值,然后把它绑定到处理函数的参数里(也就是你代码里的{session :session})。所以只要我们手动把模拟的会话数据放到请求的:session键下,中间件就会像处理真实请求一样传递这个会话数据给路由处理函数。

测试的时候,调用上面的代码应该会返回包含"Hello foo"的响应,和真实会话的效果完全一致。

内容的提问来源于stack exchange,提问作者Roberto Paredes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:46:07