2012-08-15 6 views
13

予期しない例外をスローする関数をテストするにはどうすればよいですか?ここでは、例外をスローする機能は次のとおりです。予想される例外を処理するためのテストを作成するにはどうすればよいですか?

(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))) 

私は例外がスローされ、キャッチして、比較されている次のようなテストを設計したいです。以下は動作しません:

(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"))))) 

私はこれらのエラーを取得しています:

明らか
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.  

、私はテストを書くことについて何かをしないのです。私はそれを理解するのに苦労している。私のプロジェクトは新しいleinでセットアップされ、私はleinテストでテストを実行しています。

ありがとうございました。

+0

[ユニットテストの失敗はどうすればよいですか?](http://stackoverflow.com/questions/7852092/how-do-i-expect-failure-in-a-unit-test) –

答えて

15

テストの最後のアサーションが正しくありません。 map1はマップのseqではないので、(is (= excp1 "s-o-m is not a sequence"))である必要があります。

それ以外は、(is (thrown? ..))または(is (thrown-with-msg? ...))を使用してスローされた例外がないかどうかを確認するのが明らかです。

+0

+1を使う(投げられる?...) – Alex

関連する問題