Как передать значение от приспособления к тесту с помощью clojure.тест?
При использовании clojure.использование теста-fixture , есть ли способ передать значение из функции fixture в функцию test?
2 ответа:
Несколько хороших вариантов-это динамическая привязка и
with-redefs
. Вы можете привязать var из тестового пространства имен в фикстуре, а затем использовать его в определении теста:Ядро.clj:
(ns hello.core (:gen-class)) (defn foo [x] (inc x))
Test/hello/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)))))
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}
Этот подход работает потому, чтосветильники закрываются над тестами, которые они запускают , хотя на самом деле они не получают вызывайте тестовые функции напрямую (обычно), поэтому имеет смысл использовать замыкания для передачи информации в тестовый код.
Возможно, это не прямой ответ, но если ваше приспособление было приспособлением
:each
в любом случае, или вы можете допустить, что оно было приспособлением:each
, Вы можете просто справиться и создать функциюset-up
, возвращающую соответствующее состояние, и вызвать ее в качестве первой строки вашего теста, вместо того, чтобы использовать приспособление. Это может быть лучшим подходом для некоторых обстоятельств.(defn set-up [] (get-complex-state)) (deftest blah (let [state (set-up)] (frobnicate) (query state) (tear-down state)))