2012-06-05 19 views
7

Python doctests asocia pruebas simples con el código fuente (en Python se encuentran en la documentación de la función). More info and examples here.Clojure equivalente a Python doctest?

¿Hay algo similar para Clojure?

Estoy al tanto de las pruebas unitarias con clojure.test, pero buscando algo más estrechamente integrado con la fuente (generalmente las pruebas unitarias están en diferentes archivos; aquí quiero tener la prueba "dentro" del defn).

Buscando alrededor encontré this, pero parece muy poco claro (las pruebas están en texto real, como Python - seguramente una macro que se extiende defn sería preferible?).

O tal vez hay alguna otra forma de resolver el problema general, que es que tengo algunas pruebas (generalmente cosas simples que demuestran las propiedades básicas de la función) que se incluirían mejor con la documentación (estoy usando marginalia) que en archivos de prueba de unidades separadas.

actualización Aquí hay un ejemplo: tengo una función que calcula la distancia (en manhattan) de un rectángulo de píxeles al centro de la imagen. Eso suena simple, pero se complica por cosas como la diferencia en el significado de "centro" para imágenes con números impares o pares de píxeles en los lados, o en qué parte del bloque se miden. Así que tuve que escribir algunas pruebas solo para obtener el código correcto. Y ahora miro los documentos y realmente sería mejor si los documentos incluyeran esas pruebas porque explican mejor que las palabras lo que hace la función ...

Respuesta

10

y la bandera de prueba en los metadatos, 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

se ve perfecto! no tenía idea de que existía. pero ¿cómo lo ejecutas? ¿Lein prueba llamarlo? –

+0

use test function: (test # 'mymax), doc: http://clojuredocs.org/clojure_core/clojure.core/test –

1

¿Qué tal: pre y: publicar expresiones? http://blog.fogus.me/2009/12/21/clojures-pre-and-post/

+0

oh, eso es lindo y muy cerca, pero no te voy a dar ejemplos específicos. Agregaré un ejemplo a la pregunta que podría mostrar mejor lo que estoy buscando. –

+0

': las condiciones pre' y': post' son buenas para los contratos, no tan buenas para las pruebas. – ivant

Cuestiones relacionadas