如何使用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
相关产品推荐
相关产品推荐

