2017-11-01 3 views
0

Beim Versuch, spec Bibliothek zu verwenden, erhalte ich Fehler beim Versuch, exercise-fn zu verwenden. Ich habe das auf das gepostete Beispiel um the main guide page ohne Änderung reduziert.Probleme beim Abrufen von clojure.spec exercise-fn

entsprechender Code:

(ns spec1 
    (:require [clojure.spec.alpha :as s])) 

;;this and the fdef are literal copies from the example page 
(defn adder [x] #(+ x %)) 

(s/fdef adder 
    :args (s/cat :x number?) 
    :ret (s/fspec :args (s/cat :y number?) 
       :ret number?) 
    :fn #(= (-> % :args :x) ((:ret %) 0))) 

nun die folgenden

(s/exercise-fn adder) 

Eingabe gibt den Fehler:

Exception No :args spec found, can't generate clojure.spec.alpha/exercise-fn (alpha.clj:1833) 

Abhängigkeiten/Versionen verwendet, [org.clojure/clojure „1,9 .0-beta3 "] [org.clojure/tools.logging" 0.4.0 "] [org.clojure/te st.check "0.9.0"]

Wer hat irgendwelche Ideen, warum das bricht? Vielen Dank.

Antwort

3

Sie müssen die Funktionsnamen Backquote, die das Namespacepräfix hinzufügen wird:

(s/exercise-fn `adder) 

Zum Beispiel in meinem Testcode:

(s/fdef ranged-rand 
    :args (s/and 
      (s/cat :start int? :end int?) 
      #(< (:start %) (:end %) 1e9)) ; need add 1e9 limit to avoid integer overflow 
    :ret int? 
    :fn (s/and #(>= (:ret %) (-> % :args :start)) 
      #(< (:ret %) (-> % :args :end)))) 

(dotest 
    (when true 
    (stest/instrument `ranged-rand) 
    (is (thrown? Exception (ranged-rand 8 5)))) 
    (spyx (s/exercise-fn `ranged-rand))) 

was zur Folge hat:

(s/exercise-fn (quote tst.tupelo.x.spec/ranged-rand)) => ([(-2 0) -1] [(-4 1) -1] [(-2 0) -2] [(-1 0) -1] [(-14 6) -4] [(-36 51) 45] [(-28 -3) -7] [(0 28) 27] [(-228 -53) -130] [(-2 0) -1]) 

Beachten Sie, dass der Namespace-qualifizierte Funktionsname tst.tupelo.x.spec/ranged-rand verwendet wird.

+0

ugh. Facepalm. Die Fehlermeldung ist extrem trügerisch. Danke für die Lösung. –

+0

Es gibt leider einige Fehler wie diese in der Spezifikation. –

Verwandte Themen