2017-12-23 6 views
1

Ich kann die Duplizierung nicht innerhalb eines clojure.test Tests entfernen.kann die Duplizierung beim Erstellen von Tests nicht entfernen

Angenommen, ich habe mehrere Implementierungen für die gleiche Abstraktion:

(defn foo1 [] ,,,) 
(defn foo2 [] ,,,) 
(defn foo3 [] ,,,) 

und ich habe auch einen Test, dass alle Implementierungen passieren sollte:

(defn test-impl [foo] 
    (is (= ,,, (foo)))) 

Ich kann jetzt erstellen clojure.test Test, der alle Prüfungen die Implementierungen in einem einzigen Schritt:

(deftest test-all-impls 
    (test-impl foo1) 
    (test-impl foo2) 
    (test-impl foo3)) 

Alles ist gut; die Tests in der REPL laufen erhalte ich:

(run-tests) 

Testing user 

Ran 1 tests containing 3 assertions. 
0 failures, 0 errors. 
=> {:test 1, :pass 3, :fail 0, :error 0, :type :summary} 

Ich möchte jetzt test-all-impls modifizieren, um die Vervielfältigung von entfernen test-impl explizit für jede der Implementierungen aufzurufen. Es fällt mir test-all-impls wie folgt zu ändern:

(deftest test-all-impls 
    (for [foo [foo1 foo2 foo3]] (test-impl foo)) 

Hmm, jetzt nicht alles ist gut; in der REPL bekomme ich:

(run-tests) 

Testing user 

Ran 1 tests containing 0 assertions. 
0 failures, 0 errors. 
=> {:test 1, :pass 0, :fail 0, :error 0, :type :summary} 

Was vermisse ich?

Antwort

3

um die lazyness von dafür zu bekommen, verwenden Sie doseq statt:

(deftest test-all-impls 
    (doseq [foo [foo1 foo2 foo3]] (test-impl foo)) 
1

Eine andere Antwort ist das Ergebnis in einen Vektor zu konvertieren, die die for Schleife zu laufen zwingen:

(deftest test-all-impls 
    (vec (for [foo [foo1 foo2 foo3]] (test-impl foo)))) 
Verwandte Themen