2015-12-12 29 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)) 

然后我们学会了停止这样做:)用你的环境来压缩你的逻辑对你的程序来说只是一个不好的基础。

相关问题