1

如何初始化我的数据库,以便我的 (def db ...) 在运行单元测试时不会尝试初始化数据库(因为那时它不会是数据库)。

我在函数(with-redefs)中模拟了 sql 和 dml,但到目前为止我发现的所有示例都只是直接在命名空间中定义数据库(例如,不包含在函数中)。

4

1 回答 1

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))

它并不像您想象的那么乏味,而且好处很大(用于测试、repl 驱动的开发等)。


笔记:

在 Clojure 社区的早期,人们一直在使用动态变量来避免一直添加参数。

(def ^:dynamic db nil)

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

然后我们学会了停止这样做:) 用它的环境来完善你的逻辑对于你的程序来说只是一个糟糕的基础。

于 2015-12-12T17:08:36.467 回答