我想测试我的Compojure端点,看看是否调用了所需的方法。但是,with-redefs-fn
并未取代该方法。
测试方法 -
(ns project-name.handler-test
(:require [clojure.test :refer :all]
[project-name.handler :as handler :refer [retrieve-records test-handler]]
[ring.mock.request :as mock]))
(deftest fn-handler-routes
(with-redefs-fn {#'handler/retrieve-records (fn [arg] :test)}
(let [response {:status 200 :body :test}]
(let [mock-handler (test-handler)]
(is (= response (mock-handler (mock/request :get "/records/name"))))))))
我猜测路由是静态的,因此该方法触发并返回实际数据,而不是调用重新定义的函数。 test-handler
试图规避是试图失败 - 它可以解雇,但不使用with-redefs
并返回repo数据。
相关源代码 -
(defn retrieve-records [arg] (repo/get-records arg))
(defroutes routes
(GET "/" [] (resource-response "index.html" {:root "public"}))
(context "/records" []
(GET "/name" [] (retrieve-records :lastname)))
(resources "/"))
(defn test-handler []
(-> #'routes wrap-reload))
相关问题
我怀疑与this SO question about Midje存在类似的潜在问题,但我使用的是clojure.test
,而不是midje
。
这个问题与a very similar SO question不同,因为Compojure路线是合法的,我想在:body
中返回一些东西,而不仅仅是测试状态(已经尝试过这个答案)。
这个问题与an integration test question的不同之处在于它是一个处理程序单元测试,尽管可能是相同的潜在问题。
非常感谢任何帮助。