2015-07-30 4 views

Antwort

6

Ein paar gute Möglichkeiten sind dynamische Bindung und with-redefs. Sie könnten einen var aus dem Test-Namespace in der Halterung binden und verwenden sie dann in einer Testdefinition:

core.clj:

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

(defn foo [x] 
    (inc x)) 

Test/hallo/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))))) 

Man kann sagen, dass es funktioniert, indem der Test direkt aufrufen, die nicht Vorrichtungen nicht verwendet, es durch run-tests zu nennen:

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} 

Dieser Ansatz funktioniert, weil Fixtures über die Tests schließen, die sie ausführen, obwohl sie nicht tatsächlich die Aufrufe der Testfunktionen direkt (normalerweise) machen, so dass es sinnvoll ist, Closures zu verwenden, um Informationen an den Testcode weiterzuleiten.

0

Vielleicht nicht eine direkte Antwort, aber wenn Ihre Befestigung war ein :each Halterung trotzdem, oder Sie können es eine :each Befestigung tolerieren ist, können Sie einfach Cop aus und erstellen Sie eine set-up Funktion den entsprechenden Zustand zurückkehrt und als der erste Anruf Zeile Ihres Tests, anstatt eine Fixture zu verwenden. Dies ist unter Umständen der beste Ansatz.

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

(deftest blah 
    (let [state (set-up)] 
    (frobnicate) 
    (query state) 
    (tear-down state)))