2015-12-12 55 views
1

如何使我的數據庫不變化,以便我的(def db ...)在運行我的單元測試時不會嘗試初始化數據庫(因爲它不會是數據庫那麼)。Compojure/ring應用程序,在測試範圍之外初始化數據庫

我嘲笑函數中的sql和dml(with-redefs),但到目前爲止我發現的所有示例都直接在名稱空間中定義數據庫(例如,不包含在函數中)。

回答

2

我強烈建議你不要把你的數據庫放入Var中。這是一種非常誘人但卻十分有害的環境耦合形式。

推薦的方法是將您的數據庫通過數據庫作爲任何函數的參數需要訪問它在它的身上:

;; BAD 
(def db ...) 

(defn find-user [user-id] 
    (run-query find-user-query db user-id)) 

;; GOOD 
(defn find-user [db user-id] 
    (run-query find-user-query db user-id)) 

,你會覺得這不是繁瑣,而利益是巨大的(用於測試,重新驅動開發等)。


注:

早年Clojure的社會,人們一直在使用動態VAR以避免增加一個參數的所有的時間。

(def ^:dynamic db nil) 

(binding [db ...] 
    (find-user user-id)) 

然後我們學會了停止這樣做:)用你的環境來壓縮你的邏輯對你的程序來說只是一個不好的基礎。

相關問題