如何初始化数据库,使我的(def db…)在运行单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。
我模拟函数中的sql和dml(使用redefs),但到目前为止,我发现的所有示例都只是直接在名称空间中定义数据库(例如,没有封装在函数中)。
我强烈建议您不要将数据库放在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))
它并不像你想象的那么乏味,而且好处很大(对于测试、repl驱动的开发等)
注:
在Clojure社区的早期,人们一直在使用动态Vars来避免一直添加参数。
(def ^:dynamic db nil)
(binding [db ...]
(find-user user-id))
然后我们学会了停止这样做:)用它的环境来满足你的逻辑对你的程序来说只是一个糟糕的基础。