Приложение Compojure/ring, инициализация базы данных вне области тестирования

Как мне инициализировать мою базу данных, чтобы моя (def db...) не пыталась инициализировать базу данных при выполнении моих юнит-тестов (так как тогда она не будет базой данных).

Я высмеиваю sql и dml в функциях (with-redefs), но все примеры, которые я нашел до сих пор, просто определяют базу данных непосредственно в пространстве имен (например, не обернутые в функцию).

1 ответ

Решение

Я настоятельно рекомендую вам не помещать вашу базу данных в 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))

Затем мы научились прекратить это делать:) сборка вашей логики с ее средой - просто плохая основа для ваших программ.

Другие вопросы по тегам