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宏的上下文中,第二个断言不会理解抛出的符号?。

你可以说:

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

如果在 (+ 2 3) 中抛出异常,clojure.test 将报告 1 :error 和 0 :fail 并转储堆栈跟踪。

另请注意,您(throw Exception "stuff")的错误 - 您需要在 throw 内正确构造异常。

于 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 回答