Приложение 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))
Затем мы научились прекратить это делать:) сборка вашей логики с ее средой - просто плохая основа для ваших программ.