Подтвердить что ты не робот

Clojure тестирование модулей базы данных/издевательства

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

Вот пример простого теста:

Тест-core.clj

(deftest core-test
  (is (> (count (fn-under-test "foo")) 0)))

core.clj

(defn fn-under-test [slug]
  (db/query "select * from %1" slug))

db.clj

(defn query [q & args]
  (sql/with-connection db
    (sql/with-query-results res
      [(clause q args)]
      (doall res))))

Мой вопрос: есть ли способ изнутри test-core.clj связать настраиваемую функцию с "db/query" таким образом, что core.clj будет использовать ее, в отличие от определения в db.clj?

Спасибо!

4b9b3361

Ответ 1

Вы можете использовать binding, чтобы попробовать и переопределить db/query, но сначала вам нужно определить пространство имен и var. Самый простой способ - импортировать db.clj в одно и то же пространство имен, а затем использовать привязки.

(ns test-core
    (:use clojure.test)
    (:require db))

(deftest core-test
  (binding [db/query (fn [query & args] (comment return some value here))]
    (is (> (count (fn-under-test "foo")) 0))))