with-redefs不替换clojure.test中的有效Compojure路由函数调用

时间:2016-08-08 18:57:36

标签: unit-testing clojure compojure ring

我想测试我的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的不同之处在于它是一个处理程序单元测试,尽管可能是相同的潜在问题。

非常感谢任何帮助。

0 个答案:

没有答案