无法解析符号:抛出?

时间:2012-06-27 17:53:13

标签: unit-testing clojure

在clojure中执行以下操作的正确方法是什么?

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

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

第一个testcase运行正常,但整个代码段返回“无法解析符号:抛出?”

3 个答案:

答案 0 :(得分:24)

is是一个宏,用于在其正文中查找符号thrown?并构建测试。 thrown?实际上并不是您可以调用的函数。 is的默认行为如果抛出的异常未被查找,则测试失败,因此您只需删除来自上面示例的(not (thrown?并获得您要查找的结果。

答案 1 :(得分:11)

thrown?是一个必须在is之后出现的特殊断言,所以你不能将它嵌套在其他表达式中,所以在is宏的上下文中,第二个断言会不会理解抛出的符号?

你可以说:

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

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

另请注意,您的(throw Exception "stuff")不正确 - 您需要在throw中正确构造Exception。

答案 2 :(得分:0)

如果您想对许多语句使用doseq,则可以使用它:

(testing "bla"
    (doseq [x [1 2 3 4]]
      (my-dangerous-func! x)))