17

clojureで次のことを行う適切な方法は何ですか?

(ns todo.test.models.task
  (:use [clojure.test]))

(deftest main-test
  (is (thrown? Exception (throw Exception "stuff")))
  (is (not (thrown? Exception (+ 2 3))))
)

最初のテストケースは正常に実行されますが、スニペット全体が「シンボルを解決できません:スローされましたか?」を返します。

4

3 に答える 3

30

is本体内のシンボルを検索し、thrown?テストをビルドするマクロです。 thrown?実際には呼び出すことができる関数ではありません。のデフォルトの動作はis、探していなかった例外がスローされた場合にテストに失敗するため(not (thrown?、上記の例からを削除して、探している結果を得ることができます。

于 2012-06-27T18:12:59.590 に答える
12

thrown?はの後に表示する必要がある特別なアサーションであるisため、他の式にネストすることはできません。したがって、isマクロのコンテキストでは、2番目のアサーションはスローされたシンボルを理解しません。

あなたはただ言うことができます:

(deftest main-test
  (is (thrown? Exception (throw (Exception. "stuff"))))
  (is (= 5 (+ 2 3))))

例外がスローされた場合(+ 2 3)、clojure.testは1:errorと0:failを報告し、スタックトレースをダンプします。

また、あなたが間違っていることに注意してください(throw Exception "stuff")-スロー内で例外を正しく構築する必要があります。

于 2012-06-27T18:20:25.330 に答える
0

多くのステートメントで実行する場合に使用doseqします。

(testing "bla"
    (doseq [x [1 2 3 4]]
      (my-dangerous-func! x)))
于 2019-05-02T18:34:28.023 に答える