20

予期される例外をスローする関数をテストするにはどうすればよいですか?例外をスローする関数は次のとおりです。

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

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

ありがとう。

4

1 に答える 1

20

テストの最後のアサーションは正しくありません。(is (= excp1 "s-o-m is not a sequence"))map1 は一連のマップではないため、そうあるべきです。

それとは別に、スローされた例外を使用(is (thrown? ..))または(is (thrown-with-msg? ...))チェックする方がおそらく明確です。

例:

(t/is (thrown? java.lang.ClassCastException (s/valid? ::sut/int-value "x"))))

classname をシンボルとして記述するだけであることに注意してください。java.lang.Exception正確な を気にしない場合に使用しますException

于 2012-08-15T17:54:29.717 に答える