Quando si utilizza clojure.test's use-fixture, esiste un modo per passare un valore dalla funzione di fissaggio alla funzione di test?Come passare un valore da un faro a un test con clojure.test?
risposta
Un paio di buone scelte sono il binding dinamico e with-redefs
. Si potrebbe associare un var dal namespace provetta sul supporto e quindi utilizzarlo in una definizione di test:
core.clj:
(ns hello.core
(:gen-class))
(defn foo [x]
(inc x))
test/ciao/core.clj:
(ns hello.core-test
(:require [clojure.test :refer :all]
[hello.core :refer :all]))
(def ^:dynamic *a* 4)
(defn setup [f]
(binding [*a* 42]
(with-redefs [hello.core/foo (constantly 42)]
(f))))
(use-fixtures :once setup)
(deftest a-test
(testing "testing the number 42"
(is (= *a* (foo 75)))))
si può dire che funziona confrontando chiamando direttamente il test, che non fa uso di infissi, per chiamare attraverso run-tests
:
hello.core-test> (a-test)
FAIL in (a-test) (core_test.clj:17)
testing the number 42
expected: (= *a* (foo 75))
actual: (not (= 4 76))
nil
hello.core-test> (run-tests)
Testing hello.core-test
Ran 1 tests containing 1 assertions.
0 failures, 0 errors.
{:test 1, :pass 1, :fail 0, :error 0, :type :summary}
Questo approccio funziona perché gli apparecchi chiudono i test che eseguono, sebbene non riescano a effettuare direttamente le chiamate alle funzioni di test (di solito), quindi ha senso utilizzare le chiusure per passare le informazioni al codice di test.
Forse non una risposta diretta, ma se il vostro apparecchio è stato un :each
apparecchio in ogni caso, o si può tollerare che sia un :each
apparecchio, si può solo poliziotto fuori e creare una funzione set-up
ritorno allo stato rilevante e chiamarlo come il primo linea del test, invece di utilizzare un dispositivo. Questo potrebbe essere l'approccio migliore per alcune circostanze.
(defn set-up [] (get-complex-state))
(deftest blah
(let [state (set-up)]
(frobnicate)
(query state)
(tear-down state)))