Как передать значение от приспособления к тесту с помощью clojure.тест?


При использовании clojure.использование теста-fixture , есть ли способ передать значение из функции fixture в функцию test?

2 12

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)))