【发布时间】:2016-03-18 08:47:56
【问题描述】:
如何初始化我的数据库,以便我的 (def db ...) 在运行我的单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。
我在函数(with-redefs)中模拟了 sql 和 dml,但到目前为止我发现的所有示例都只是直接在命名空间中定义数据库(例如,不包含在函数中)。
【问题讨论】:
标签: unit-testing clojure compojure ring korma
如何初始化我的数据库,以便我的 (def db ...) 在运行我的单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。
我在函数(with-redefs)中模拟了 sql 和 dml,但到目前为止我发现的所有示例都只是直接在命名空间中定义数据库(例如,不包含在函数中)。
【问题讨论】:
标签: unit-testing clojure compojure ring korma
我强烈建议您不要将数据库放在 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))
然后我们学会了停止这样做 :) 将你的逻辑与它的环境结合起来只是你的程序的一个糟糕的基础。
【讨论】: