我正在尝试使用ring-mock编写一个midje测试来为解放器端点做一个帖子。我可以成功地为获取请求编写测试,但我似乎无法将数据传递到帖子,我只能找回格式错误的响应。这是我所拥有的代码的核心。
;; ====
; Resource
;; ====
(def users (atom [{:id 1 :name "User One"} {:id 2 :name "User Two"}]))
(defn malformed-users? [context]
(let [params (get-in context [:request :multipart-params])]
(and
(empty? (get params "id"))
(= (get-in context [:request :request-method]) :post))))
(defresource all-users []
:allowed-methods [:get :post]
:available-media-types ["application/json"]
:handle-ok (fn [_] {:users @users})
:malformed? (fn [context] (malformed-users? context))
:handle-malformed "You need to pass both a valid name and id"
:post! (fn [context]
(let [params (get-in context [:request :multipart-params])]
(swap! users conj {:id (bigint (get params "id")) :name (get params "name")})))
:handle-created (fn [_] {:users @users}))
(defroutes user-routes
(ANY "/users" [_] (all-users)))
;; ====
; Test
;; ====
(fact "Get request to users endpoint returns desired content"
(let [response (user-routes (mock/request :post "/users" {:id "3" :name "TestGuy"}))]
(:status response) => 201
(get-in response [:headers "Content-Type"]) => "application/json;charset=UTF-8"))
答案 0 :(得分:2)
此代码存在一些问题。
首先,您的资源接受JSON,但您的代码使用多部分参数。您需要决定是否接受" application / json"或" multipart / form-data"。
我们假设您已接受JSON。在这种情况下,您需要从请求正文中实际解析此数据。通常你会这样做:畸形?决定点。请参阅Liberator网站上的putting it all together文档。
第三,您的模拟请求需要包含内容类型,并将主体格式化为JSON。 Ring-Mock库非常简单;除非你说出来,否则它无法猜出你需要什么。
您的代码中还有一些其他奇怪的内容,例如(empty? (get params "id"))
。你真的希望你的" id"参数是一个集合?
我建议你先看一下Liberator的例子,然后在尝试更复杂的资源之前尝试简单的工作。