Передача данных на конечную точку поста освободителя в тесте midje с использованием ring-mock

Я пытаюсь написать тест midje, используя ring-mock, чтобы сделать сообщение для конечной точки освободителя. Я могу успешно написать тест для получения запросов, но я не могу передать данные на почту, я получаю только неправильный ответ. Вот основная часть кода, который у меня есть.

;; ====
; 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"))

1 ответ

Решение

Есть несколько проблем с этим кодом.

Во-первых, ваш ресурс принимает JSON, но ваш код использует многокомпонентные параметры. Вам нужно решить, принимаете ли вы "application/json" или "multipart/form-data".

Давайте предположим, что вы принимаете JSON. В этом случае вам нужно фактически проанализировать эти данные из тела запроса. Обычно вы делаете это на:malformed? точка принятия решения. Смотрите документацию по сборке всего этого на веб-сайте Liberator.

В-третьих, ваш пробный запрос должен включать тип контента и форматировать тело как JSON. Библиотека Ring-Mock очень проста; он не может угадать, что вам нужно, если вы не скажете это.

В вашем коде есть несколько других странных вещей, таких как (empty? (get params "id")), Вы действительно ожидаете, что ваш параметр "id" будет коллекцией?

Я бы посоветовал взглянуть на примеры Liberator и попытаться сделать что-то простое, прежде чем пытаться использовать более сложные ресурсы.

Другие вопросы по тегам