2015-07-30 8 views

उत्तर

6

कुछ अच्छे विकल्प गतिशील बाध्यकारी और with-redefs हैं। आप स्थिरता में परीक्षण नाम स्थान से एक वर बाँध सकते हैं और फिर एक परीक्षण परिभाषा में उपयोग:

core.clj:

(ns hello.core 
    (:gen-class)) 

(defn foo [x] 
    (inc x)) 

परीक्षा/हैलो/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} 

यह दृष्टिकोण काम करता है क्योंकि फिक्स्चर वे चलाने वाले परीक्षणों के करीब हैं, हालांकि वे वास्तव में परीक्षण कार्यों में सीधे कॉल नहीं करते हैं (आमतौर पर) ताकि परीक्षण कोड में जानकारी पास करने के लिए बंद करने का अर्थ हो।

0

शायद नहीं एक सीधा जवाब है, लेकिन अगर आपके स्थिरता एक :each स्थिरता वैसे भी था, या आप इसे एक :each स्थिरता, तुम बस पुलिस कर सकते हैं बाहर होने को सहन और प्रासंगिक राज्य लौटने एक set-up समारोह बना सकते हैं और पहले के रूप में यह कॉल कर सकते हैं एक स्थिरता का उपयोग करने के बजाय, अपने परीक्षण की रेखा। यह कुछ परिस्थितियों के लिए सबसे अच्छा तरीका हो सकता है।

(defn set-up [] (get-complex-state)) 

(deftest blah 
    (let [state (set-up)] 
    (frobnicate) 
    (query state) 
    (tear-down state))) 
संबंधित मुद्दे