2011-10-21 8 views
8

Stiamo scrivendo unit test per il nostro codice in Clojure usando clojure.test.Come mi aspetto un errore in un test unitario?

Alcuni dei nostri test ignorano l'API e interrompono intenzionalmente il codice, al fine di fungere da documentazione per le carenze latenti nel codice.

Tuttavia, vogliamo distinguere tra guasti di questi test e guasti di test normali.

Non abbiamo visto alcun suggerimento nella documentazione clojure.test - solo (is (thrown? ...)), che naturalmente non fa ciò di cui abbiamo bisogno.

Qualche suggerimento? Fondamentalmente, stiamo cercando qualcosa come (is (not <condition>)), tranne che il framework di test dovrebbe registrare un errore previsto - qualcosa come this.

+0

Quando si dice "il framework di test dovrebbe registrare un errore previsto", intendi che il framework di test dovrebbe riconoscere che il test è stato superato perché ha generato un'eccezione che ti aspettavi, o intendi che dovrebbe riconoscere tre tipi di risultati: passaggi, guasti e guasti previsti, i secondi dei quali sono registrati esplicitamente? – user100464

+0

@ user100464: qualcosa del genere: http://docs.python.org/library/unittest.html#skipping-tests-and-expected-failures. Quindi vorremmo registrare in modo esplicito i guasti previsti. –

risposta

3

Ho eseguito test per generare un'eccezione quando "non funzionano" in questo modo, quindi ho utilizzato thrown? per verificare se l'eccezione arriva come previsto. Ci può benissimo esistere un modo più elegante, ma questo ha il compito.

+0

Sì, temevo che questo potesse essere il modo più semplice. –

0

Rebind la funzione di report come documentato in clojure.test. Da lì puoi cambiare il modo in cui viene gestito e segnalato il 'fallimento'.

0

Un po 'tardi per la festa, lo so, ma se si utilizza Leiningen è possibile utilizzare i selettori di test per escludere i guasti previsti dalla build "normale". Nel vostro project.clj:

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

quindi scrivere il test come:

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

Calling lein test verrà eseguito solo i test senza il: metadati-fallimento previsto. Chiamando lein test :expected-failure si eseguiranno i test di errore previsti. Forse non proprio quello che speravi, ma IMHO meglio di dover usare thrown? dappertutto. Almeno in questo modo i fallimenti attesi sono esplicitamente documentati nel codice e non interferiscono con la compilazione.

1

Come @andy ha detto che è possibile ricollegare la funzione 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))))) 

E utilizzare questa macro in questo modo:

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

Questo sarà prova di passaggio di successo.