如何通过此测试:
(ns imp-rest.parser-test-rest
(:require [clojure.test :refer :all])
(:require [ring.mock.request :as mock] )
(:require [imp-rest.web :as w]))
(deftest test-parser-rest
(testing "put settings"
(w/app
(mock/request :put "/settings/coordinateName" "FOO" ))
(let [response (w/app (mock/request :get "/settings"))]
(println response )
(is (= (get (:body response) :coordinateName) "FOO")))))
它失败了:
FAIL in (test-parser-rest) (parser_test_rest.clj:30)
put settings
expected: (= (get (:body response) :coordinateName) "FOO")
actual: (not (= nil "FOO"))
这是我的处理程序:
(ns imp-rest.web
(:use compojure.core)
(:use ring.middleware.json-params)
(:require [clj-json.core :as json])
(:require [ring.util.response :as response])
(:require [compojure.route :as route])
(:require [imp-rest.settings :as s]))
(defn json-response [data & [status]]
{:status (or status 200)
:headers {"Content-Type" "application/json"}
:body (json/generate-string data)})
(defroutes handler
(GET "/settings" []
(json-response (s/get-settings)))
(GET "/settings/:id" [id]
(json-response (s/get-setting id)))
(PUT "/settings" [id value]
(json-response (s/put-setting id value)))
(route/not-found "Page not found") )
(def app
(-> handler
wrap-json-params))
公开此地图(设置):
(ns imp-rest.settings)
(def settings
(atom
{:coordinateName nil
:burnin nil
:nslices nil
:mrsd nil
}))
(defn get-settings []
@settings)
(defn get-setting [id]
(@settings (keyword id)))
(defn put-setting [id value]
(swap! settings assoc (keyword id) value)
value)
和切入点:
(ns imp-rest.core
(:use ring.adapter.jetty)
(:require [imp-rest.web :as web]))
(defn -main
"Entry point"
[& args]
(do
(run-jetty #'web/app {:port 8080})
);END;do
);END: main
现在,当我'lein run'时,我可以提出这样的(工作)请求:
curl -X PUT -H "Content-Type: application/json" \
-d '{"id" : "coordinateName", "value" : "FOO"}' \
http://localhost:8080/settings
这是我尝试用测试模拟的东西。任何帮助表示赞赏。
答案 0 :(得分:3)
:id
路由接受正文中的PUT /settings/:id
格式为{"value": "..."}
,则需要更改路由定义:(defroutes handler
(GET "/settings" []
(json-response (s/get-settings)))
(GET "/settings/:id" [id]
(json-response (s/get-setting id)))
(PUT "/settings/:id" [id value]
(json-response (s/put-setting id value)))
(route/not-found "Page not found"))
并更改您在测试中调用PUT
端点的方式:
(w/app
(-> (mock/request
:put
"/settings/coordinateName"
(json/generate-string {:value "FOO"}))
(mock/content-type "application/json")))
改变了什么?
:id
网址路线定义中的PUT
(/settings
- > /settings/:id
)PUT
请求未发送正确的请求和内容类型。PUT /settings
路由期望{"id": "...", "value": "..."}
请求正文,则需要更改创建模拟请求的方式:(w/app
(-> (mock/request
:put
"/settings"
(json/generate-string {:id "coordinateName" :value "FOO"}))
(mock/content-type "application/json"))
答案 1 :(得分:2)
您的curl请求在PUT请求的正文中将参数指定为JSON,但您的模拟请求尝试使用URL参数。
有两种方法可以解决这个问题:
wrap-json-params
添加到您的处理程序中,但您缺少wrap-params
。 Piotrek Bzdyl的答案相当于在组合路线中明确指出这些参数。request.mock.body
在模拟请求的正文中将ID /值对添加为JSON。