3

我正在尝试使用 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"))
4

1 回答 1

2

这段代码有一些问题。

首先,您的资源接受 JSON,但您的代码使用多部分参数。您需要决定是接受“application/json”还是“multipart/form-data”。

假设您接受 JSON。在这种情况下,您需要从请求正文中实际解析此数据。通常你在 :malformed? 决策点。请参阅Liberator 网站上的将所有内容放在一起文档。

第三,您的模拟请求需要包含内容类型,并将正文格式化为 JSON。Ring-Mock 库非常简单;除非您告诉它,否则它无法猜测您需要什么。

您的代码中还有一些其他奇怪的东西,例如(empty? (get params "id")). 你真的希望你的“id”参数是一个集合吗?

在尝试更复杂的资源之前,我建议查看 Liberator 示例,并尝试让一些简单的工作正常工作。

于 2014-09-07T21:43:50.613 回答