clojure.test's use-fixture'u kullanırken, fikstür işlevinden test işlevine bir değer iletmenin bir yolu var mı?Bir fikstürden clojure.test ile bir teste nasıl geçilir?
cevap
Birkaç iyi seçenek dinamik bağlama ve with-redefs
. Sen fikstür test ad alanından bir var bağlamak ve sonra bir test tanımında bunu kullanabilirsiniz:
core.clj:
(ns hello.core
(:gen-class))
(defn foo [x]
(inc x))
test/merhaba/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)))))
bunu run-tests
içinden çağrılmasına, demirbaşlar kullanmaz, hangi doğrudan testi çağırarak karşılaştırarak çalıştığını söyleyebilirim:
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}
Bu yaklaşım, fikstürlerinin çalışmasını test ettikleri için kapattığından çalışmaktadır, ancak gerçekten de (genellikle) test işlevlerine yapılan çağrıları doğrudan almazlar, bu nedenle test koduna bilgi aktarmak için kapakların kullanılması mantıklı olur.
Belki de değil doğrudan bir cevap, fikstürün bir :each
fikstürü zaten, ya da bunu yapabilirsiniz, sadece polis bir :each
fikstürü dışarı olmanın tahammül ve ilgili devlet dönen bir set-up
fonksiyonunu oluşturmak ve ilk olarak diyoruz ama eğer Bir fikstür yerine, testinizin satırı. Bu, bazı durumlar için en iyi yaklaşım olabilir.
(defn set-up [] (get-complex-state))
(deftest blah
(let [state (set-up)]
(frobnicate)
(query state)
(tear-down state)))