2012-08-15 16 views
13

Jak mogę przetestować funkcję, która zgłasza oczekiwany wyjątek? Oto funkcja, która zgłasza wyjątek:Jak napisać test, aby obsłużyć oczekiwany wyjątek?

(defn seq-of-maps? 
    "Tests for a sequence of maps, and throws a custom exception if not." 
    [s-o-m] 
    (if-not (seq? s-o-m) 
    (throw (IllegalArgumentException. "s-o-m is not a sequence")) 
    (if-not (map? (first s-o-m)) 
     (throw (IllegalArgumentException. "s-o-m is not a sequence of maps.")) 
     true))) 

Chcę zaprojektować test jak poniżej, w którym jest wyjątek i złapać, a następnie porównywane. Poniższa nie działa:

(deftest test-seq-of-maps 
    (let [map1 {:key1 "val1"} 
     empv [] 
     s-o-m (list {:key1 "val1"}{:key2 "val2"}) 
     excp1 (try 
       (seq-of-maps? map1) 
       (catch Exception e (.getMessage e)))] 
    (is (seq-of-maps? s-o-m)) 
    (is (not (= excp1 "s-o-m is not a sequence"))))) 

Dostaję te błędy:

Testing util.test.core 

FAIL in (test-seq-of-maps) (core.clj:27) 
expected: (not (= excp1 "s-o-m is not a sequence")) 
    actual: (not (not true)) 

Ran 2 tests containing 6 assertions. 
1 failures, 0 errors.  

Oczywiście brakuje mi coś o pisaniu testów. Mam problem z wymyśleniem tego. Mój projekt został skonfigurowany z nowym programem lein, a testy przeprowadzam testem lein.

Dzięki.

+0

możliwy duplikat [Jak mogę oczekiwać niepowodzenia w teście jednostki?] (Http://stackoverflow.com/questions/7852092/how-do-i-expect-failure-in-a-itit-test) –

Odpowiedz

15

Ostatnie stwierdzenie w teście jest nieprawidłowe; powinno być (is (= excp1 "s-o-m is not a sequence")), ponieważ map1 nie jest seq map.

Oprócz tego prawdopodobnie lepiej jest użyć (is (thrown? ..)) lub (is (thrown-with-msg? ...)), aby sprawdzić wyjątki.

+0

+1 do używania (wyrzucane? ...) – Alex

Powiązane problemy