Clojure 测试:测试断言的否定

int*_*tar 5 unit-testing clojure

这对我有用:

(is  (thrown? AbstractMethodError (.fun obj 1) ))
Run Code Online (Sandbox Code Playgroud)

但这却炸了

(is (not (thrown? AbstractMethodError (.fun obj 1) )))
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

java.lang.RuntimeException: Unable to resolve symbol: thrown? in this context
Run Code Online (Sandbox Code Playgroud)

大概是“扔了”?“是”里面有一些特殊的含义,当我把“不是”放在中间时,它就不可见了。

那么我如何测试像抛出这样的断言的否定呢?

Die*_*sch 5

你是对的,thrown?是一个特殊的断言,必须出现在is. 如果您想测试是否未引发异常(换句话说,调用计算结果),您可能需要执行以下操作:

(is (.fun obj 1))

尽管这有一个问题:如果结果为 false(false,nil),它就会失败。完全确定的是:

(let [r (.fun obj 1)]
  (is (= r r)))
Run Code Online (Sandbox Code Playgroud)

(这是一个同义反复,只有在抛出异常时才会失败)。