Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure Compojure应用程序无法与redefs配合使用_Clojure_Compojure_Ring - Fatal编程技术网

Clojure Compojure应用程序无法与redefs配合使用

Clojure Compojure应用程序无法与redefs配合使用,clojure,compojure,ring,Clojure,Compojure,Ring,我正在编写一个Compojure应用程序,并使用CLJWebDriver以图形方式对其进行测试。我试图使用redefs的来模拟从持久性中提取数据以只返回固定值的函数,但它忽略了我的函数覆盖。我知道redefs的在vars方面起作用,但它仍然不起作用: project.clj相关部分: (defproject run-hub "0.1.0-SNAPSHOT"

我正在编写一个Compojure应用程序,并使用
CLJWebDriver
以图形方式对其进行测试。我试图使用redefs的
来模拟从持久性中提取数据以只返回固定值的函数,但它忽略了我的函数覆盖。我知道redefs的
在vars方面起作用,但它仍然不起作用:

project.clj相关部分:

(defproject run-hub "0.1.0-SNAPSHOT"                                                                                                                        
  :main run-hub.handler/start-server)
handler.clj:

(ns run-hub.handler
  (:require [compojure.core :refer :all]
            [compojure.handler :as handler]
            [compojure.route :as route]
            [ring.adapter.jetty :refer :all]
            [run-hub.controllers.log-controller :as log-controller]))

(defroutes app-routes
  (GET "/MikeDrogalis/log" [] (log-controller/mikes-log))
  (route/resources "/")
  (route/not-found "Not Found"))

(def app (handler/site #'app-routes))
log-controller.clj:

(ns run-hub.controllers.log-controller                                                                                                                      
  (:require [run-hub.views.log :as views]
            [run-hub.persistence :as persistence]))

(defn mikes-log []
  (views/mikes-log (persistence/mikes-log)))
persistence.clj

(ns run-hub.persistence                                                                                                                                     
  (require [clj-time.core :as time]
           [run-hub.models.log :as log]))

(defn mikes-log [] [])
最后是我的图形测试,它试图覆盖
mikes log
,但失败了:

(fact
 "It has the first date of training as August 19, 2012"
 (with-redefs [persistence/mikes-log (fn [] (one-week-snippet))]
   (to (local "/MikeDrogalis/log"))
   (.contains (text "#training-log") "August 19, 2012"))                                                                                                    
 => true)
其中,
one week snippet
是一个返回一些示例数据的函数。 (defn启动服务器[]
(运行jetty(var app){:port 3000:join?false}))

我能够在
clj webdriver
测试中使用redefs
,执行以下操作:

(defn with-server
  [f]
  (let [server (run-jetty #'APP {:port 0 :join? false})
        port (-> server .getConnectors first .getLocalPort)]
    (binding [test-port port]
      (try
        (println "Started jetty on port " test-port)
        (f)
        (finally
          (.stop server))))))

(use-fixtures :once with-server)
然后,所有的测试都有了自己的jetty,这似乎在运行
使用redefs的
工作方式。

我能够在
clj webdriver
测试中使用
和redefs的
,执行以下操作:

(defn with-server
  [f]
  (let [server (run-jetty #'APP {:port 0 :join? false})
        port (-> server .getConnectors first .getLocalPort)]
    (binding [test-port port]
      (try
        (println "Started jetty on port " test-port)
        (f)
        (finally
          (.stop server))))))

(use-fixtures :once with-server)
然后,所有的测试都有了自己的jetty,这似乎在运行
使用redefs的
这种方式可以工作。

我猜测试调用web服务器,这是一个单独的过程,因此测试中的redefs(客户端)代码不会影响服务器代码上的var绑定,是的。我被难住了。使用CLJWebDriver的假设是您正在编写高级集成测试。在我看来,这些测试应该运行整个堆栈,因此在这里截取函数对我来说没有什么意义。假设您的单个名称空间已经过单元测试,为什么要在集成测试中存根此函数?我猜测试调用web服务器是一个单独的过程,因此测试(客户端)中的redefs代码不会影响服务器代码上的var绑定似乎是可能的,是的。我被难住了。使用CLJWebDriver的假设是您正在编写高级集成测试。在我看来,这些测试应该运行整个堆栈,因此在这里截取函数对我来说没有什么意义。假设您的单个名称空间已经过单元测试,为什么要在集成测试中存根此函数?