2015-07-30 26 views

cevap

6

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.

0

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))) 
İlgili konular