2015-12-12 4 views
1

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

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

ответ

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

Это не так утомительно, как можно подумать, а выгоды велики (для тестирования, репликации и т. д.).


Примечание:

В первые годы сообщества Clojure, люди используют динамическую Vars, чтобы избежать необходимости добавления параметра все время.

(def ^:dynamic db nil) 

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

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