2011-10-21 8 views
8

Estamos escribiendo pruebas de unidad para nuestro código en Clojure usando clojure.test.¿Cómo espero falla en una prueba de unidad?

Algunas de nuestras pruebas ignoran la API y rompen intencionadamente el código, para servir como documentación de deficiencias latentes en el código.

Sin embargo, queremos distinguir entre las fallas de estas pruebas y las fallas de las pruebas normales.

No hemos visto ninguna sugerencia en la documentación clojure.test - solo (is (thrown? ...)), que por supuesto no hace lo que necesitamos.

¿Alguna sugerencia? Básicamente, estamos buscando algo como (is (not <condition>)), excepto que el marco de prueba debe registrar una falla esperada, algo así como this.

+0

Cuando dice "el marco de prueba debe registrar una falla esperada", ¿quiere decir que el marco de prueba debería reconocer que la prueba pasó porque arrojó una excepción que esperaba, o quiere decir que debería reconocer tres tipos de resultados? pases, fallas y fallas esperadas, estas últimas se registran explícitamente? – user100464

+0

@ user100464: algo como esto: http://docs.python.org/library/unittest.html#skipping-tests-and-expected-failures. Por lo tanto, nos gustaría registrar explícitamente las fallas esperadas. –

Respuesta

3

He hecho que las pruebas emitan una excepción cuando 'fallan' así, y luego utilicé thrown? para probar si la excepción llega como se esperaba. Muy bien puede existir una manera más elegante, pero esto hace el trabajo.

+0

Sí, tenía miedo de que esta pudiera ser la manera más fácil. –

0

Vuelva a vincular la función de informe como se documenta en clojure.test. A partir de ahí, puede cambiar cómo se maneja y se informa sobre la 'falla'.

0

Llego un poco tarde a la fiesta, lo sé, pero si usa Leiningen podría usar selectores de prueba para excluir las fallas esperadas de la compilación "normal". En su project.clj:

:test-selectors {:default #(not :expected-failure %) 
       :expected-failure :expected-failure} 

después escribe su ensayo como:

(deftest ^:expected-failure test-with-expected-failure ...) 

Calling lein test se ejecutará sólo aquellas pruebas sin el: metadatos fallo esperado. Llamando al lein test :expected-failure ejecutará sus pruebas de falla esperadas. Tal vez no sea exactamente lo que esperabas, pero en mi humilde opinión mejor que tener que usar thrown? por todas partes. Al menos, de esta forma, las fallas esperadas se documentan explícitamente en el código y no interferirán con la compilación.

1

Como @andy dijo que puede volver a enlazar la función report.

(defmacro should-fail [body] 
    `(let [report-type# (atom nil)] 
    (binding [clojure.test/report #(reset! report-type# (:type %))] 
     ~body) 
    (testing "should fail" 
     (is (= @report-type# :fail))))) 

Y utilizar esta macro como esta:

(should-fail (is (= 1 2))) 

lo que tendrá éxito la prueba de paso.

Cuestiones relacionadas