2011-07-22 125 views
12

我剛剛開始研究數據庫繁重的Clojure應用程序,並試圖獲得一些單元測試。理想情況下,我想通過嘲笑事情來避免實際觸及真正的數據庫。Clojure數據庫單元測試/嘲諷

這裏有一個簡單的測試示例:

測試core.clj

(deftest core-test 
    (is (> (count (fn-under-test "foo")) 0))) 

core.clj

(defn fn-under-test [slug] 
    (db/query "select * from %1" slug)) 

db.clj

(defn query [q & args] 
    (sql/with-connection db 
    (sql/with-query-results res 
     [(clause q args)] 
     (doall res)))) 

我的問題:有沒有辦法,從內部test-core.clj,將自定義函數綁定到'db/query',使得core.clj將使用它,而不是db.clj中的定義?

謝謝!

回答

10

您可以使用binding嘗試重寫db/query,但您需要首先定義命名空間和var。最簡單的方法是將db.clj導入到相同的命名空間,然後使用綁定。

(ns test-core 
    (:use clojure.test) 
    (:require db)) 

(deftest core-test 
    (binding [db/query (fn [query & args] (comment return some value here))] 
    (is (> (count (fn-under-test "foo")) 0)))) 
+0

謝謝!我今天早些時候嘗試使用綁定(和綁定),但不能讓它離開 - 我一直在線程「main」中得到_Exception java.lang.Exception:無法解析此中的var:db/query context_。 – eff

+0

你可以嘗試在你的測試中需要db.clj,然後使用綁定。 – Jeff

+0

完美! :需要db解決了一切。萬分感謝! – eff