Compojure/ring 应用程序,在测试范围外初始化数据库
Compojure/ring app, initialize database outside test-scope
如何初始化我的数据库,以便我的 (def db ...) 在 运行 我的单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。
我在函数中模拟了 sql 和 dml(with-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 社区的早期,人们一直在使用动态变量来避免一直添加参数。
(def ^:dynamic db nil)
(binding [db ...]
(find-user user-id))
然后我们学会了停止这样做:)用它的环境来完成你的逻辑只是你程序的一个糟糕的基础。
如何初始化我的数据库,以便我的 (def db ...) 在 运行 我的单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。
我在函数中模拟了 sql 和 dml(with-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 社区的早期,人们一直在使用动态变量来避免一直添加参数。
(def ^:dynamic db nil)
(binding [db ...]
(find-user user-id))
然后我们学会了停止这样做:)用它的环境来完成你的逻辑只是你程序的一个糟糕的基础。