2012-06-05 15 views
7

I doctest Python associano test semplici al codice sorgente (in Python si trovano nella documentazione della funzione). More info and examples here.Clojure equivalente al doctest Python?

C'è qualcosa di simile per Clojure?

Sono a conoscenza dei test di unità con clojure.test, ma cerco qualcosa di più strettamente integrato con la fonte (in genere i test di unità sono in file diversi, qui voglio avere il test "dentro" il defn).

Cercando in giro ho trovato this, ma sembra molto poco lispy (i test sono nel testo vero e proprio, come Python -? Sicuramente una macro che si estende defn sarebbe preferibile).

O forse c'è un altro modo per risolvere il problema generale, che è che ho alcuni test (in genere semplici cose che dimostrano le proprietà di base della funzione) che sarebbe meglio incluso nella documentazione (sto usando marginalia) rispetto a file di test dell'unità separati.

aggiornamento Ecco un esempio: Ho una funzione che calcola la distanza (in manhattan) (in pixel) da un rettangolo di pixel al centro dell'immagine. Sembra semplice, ma è complicato da cose come la differenza di significato di "centro" per le immagini con numeri pari o dispari di pixel sui lati o da quale parte del blocco si misura. Quindi ho dovuto scrivere alcuni test solo per ottenere il codice giusto. E ora guardo i documenti e sarebbe davvero meglio se i documenti includessero quei test perché spiegano meglio delle parole cosa fa la funzione ...

risposta

10

e la bandiera di prova nei metadati, http://clojure.org/special_forms

(defn 
^{:doc "mymax [xs+] gets the maximum value in xs using > " 
    :test (fn [] 
      (assert (= 42 (mymax 2 42 5 4)))) 
    :user/comment "this is the best fn ever!"} 
    mymax 
    ([x] x) 
    ([x y] (if (> x y) x y)) 
    ([x y & more] 
    (reduce mymax (mymax x y) more))) 

user=> (test #'mymax) 
:ok 
user=> (doc test) 
------------------------- 
clojure.core/test 
([v]) 
    test [v] finds fn at key :test in var metadata and calls it, 
    presuming failure will throw exception 
nil 
+0

sembra perfetto! non avevo idea che esistesse. ma come lo gestisci? lo chiama lein test? –

+0

usa la funzione test: (test # 'mymax), doc: http://clojuredocs.org/clojure_core/clojure.core/test –

1

Che ne dici di: pre e: post espressioni? http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+0

oh che carino e molto vicino, ma non mi permette di dare esempi specifici. aggiungerò un esempio alla domanda che potrebbe mostrare meglio ciò che sto cercando. –

+0

': pre' e': post' le condizioni sono buone per i contratti, non così buone per i test. – ivant

Problemi correlati