Clojure 如何使用ring.mock.request模拟PUT请求
如何通过此测试:Clojure 如何使用ring.mock.request模拟PUT请求,clojure,mocking,put,ring,Clojure,Mocking,Put,Ring,如何通过此测试: (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
(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.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
这就是我在考试中试图嘲弄的。非常感谢您的帮助。如果您想在您的放置/设置/:id
路由接受主体中使用格式为{“value”:“…”}
的:id
,您需要更改路由定义:
并更改在测试中调用PUT
端点的方式:
(w/app
(-> (mock/request
:put
"/settings/coordinateName"
(json/generate-string {:value "FOO"}))
(mock/content-type "application/json")))
改变了什么
:id
在您的PUT
URL路由定义中(/settings
->/settings/:id
)PUT
请求未发送正确的请求和内容类型PUT/settings
路由,该路由需要{“id”:“…”,“value”:“…”}
请求正文,则需要更改创建模拟请求的方式:
curl请求在PUT请求体中将参数指定为JSON,但mock请求尝试使用URL参数 有两个选项可以解决此问题:
- compojure可以自动转换参数,但只有当相关的中间件存在时——您的处理程序中添加了
,但缺少了。Piotrek Bzdyl的回答相当于在compojure路由中明确这些参数wrap json参数
- 或者,您可以使用在模拟请求主体中添加ID/值对作为JSON
(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"))
(w/app
(-> (mock/request
:put
"/settings/coordinateName"
(json/generate-string {:value "FOO"}))
(mock/content-type "application/json")))
(w/app
(-> (mock/request
:put
"/settings"
(json/generate-string {:id "coordinateName" :value "FOO"}))
(mock/content-type "application/json"))