2017-04-24 5 views
2

Ich habe einige Fixtures, die die Datenbank in meinem Projekt starten und schließen.Clojure test: Globale Fixtures

Jetzt sieht es so etwas wie dieses:

(use-fixtures :once with-embedded-db) 

während in der Halterung selbst ich eine dynamische Variable haben, die ich an verschiedenen Orten verwenden:

(def ^:dynamic *db*) 

(defn with-embedded-db [f] 
    (binding [*db* (db/connect args)] 
    (f) 
    (finally 
     (db/clean-up *db))) 

Es sei nun angenommen, dass db/connect und db/clean-up nehmen Sie sich etwas Zeit.

PROBLEM:

Wenn ich Tests durchgeführt unter Verwendung von lein test, dauert es sehr lange, unnötig Zeit zu verbringen zum Anschluss und für jeden Namespace in das db trennen.

FRAGE:

Gibt es eine Möglichkeit globale Vorrichtungen einzurichten so dass, wenn ich lein test laufen, es ruft es nur einmal für alle Testnamespaces?

Danke!

Antwort

2

Es wäre besser gewesen, wenn diese Funktion zu Leiningen selbst hinzugefügt wurde. Zumindest sollte ein Ticket geöffnet werden, wenn nicht eine PR.

Die folgende Lösung ist schmutzig, aber Sie können die Idee und verwandeln es in etwas intelligenter.

;; 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) 
]}} 

Hinweis: Leiningen selbst verwendet robert/hooke in seinem Kern. Und dann irgendwo in Tests:

(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*))) 
+0

oh ich werde das auf jeden Fall überprüfen! :) Ich habe versucht, das Plugin zu schreiben, ich dachte auch daran, 'robert/hooke' zu ​​verwenden, das sieht so aus, als ob es Sinn macht ... Ich werde dich wissen lassen, ob es funktioniert – andrusieczko

+0

Ich habe etwas verwendet, das deinem Code ähnlich ist. vielen Dank! – andrusieczko

1

Verwenden circleci.test unterstützt es :global-fixtures:

... Sie globale Vorrichtungen definieren, die nur einmal für den gesamten Testlauf ausgeführt werden, unabhängig davon, wie viele Namespaces, die Sie ausführen.