Clojure 测试:全局装置

and*_*zko 6 testing clojure

我的项目中有一些启动和关闭数据库的装置。

现在看起来像这样:

(use-fixtures :once with-embedded-db)
Run Code Online (Sandbox Code Playgroud)

在夹具本身中,我有一个在不同地方使用的动态变量:

(def ^:dynamic *db*)

(defn with-embedded-db [f]
  (binding [*db* (db/connect args)]
    (f)
    (finally
      (db/clean-up *db)))
Run Code Online (Sandbox Code Playgroud)

现在,假设这一点db/connectdb/clean-up花一些时间。

问题

当我使用 运行测试时lein test,需要很长时间,不必要地花费时间连接和断开每个命名空间的数据库。

问题

有没有一种方法可以设置全局固定装置,以便当我运行时lein test,它只对所有测试命名空间调用一次

谢谢!

ako*_*ond 3

如果该功能添加到 leiningen 本身会更好。如果不是 PR,至少应该开一张票。

下面的解决方案很脏,但你可以理解这个想法并将其转化为更智能的东西。

;; profect.clj
:profiles 
 {:dev {:dependencies [[robert/hooke "1.1.2"]]

 :injections   [(require '[robert.hooke :as hooke])
  (defn run-all-test-hook [f & nss]
  (doall (map (fn [a]
   (when (intern a '*db*)
    (intern a '*db* "1234"))) nss))
  (apply f nss))
  (hooke/add-hook #'clojure.test/run-tests #'run-all-test-hook)
 ]}}
Run Code Online (Sandbox Code Playgroud)

注:leiningen 本身在其核心中使用了 robert/hooke。然后在测试中的某个地方:

(ns reagenttest.cli
    (:require [clojure.test :refer :all]))

(def ^:dynamic *db*) ;; should be defined in every NS where it is needed

(deftest Again
    (testing "new"
        (prn *db*)))
Run Code Online (Sandbox Code Playgroud)