Unit testing 如何在Clojure中运行单元测试时抑制异常输出
我将leiningen用于clojure,我有一套在运行Unit testing 如何在Clojure中运行单元测试时抑制异常输出,unit-testing,clojure,leiningen,Unit Testing,Clojure,Leiningen,我将leiningen用于clojure,我有一套在运行lein test时运行的单元测试 我注意到,在一些测试中,我们希望测试异常处理场景,并为此抛出一个异常。 问题是,它在命令行中返回一个完整的堆栈跟踪,我通常认为这是发生了不好的事情,而实际上不是 来自JS世界,我发现我们可以抑制异常,我们想在jest之类的框架中将其标记为抑制异常,leiningen或clojure对此有什么选择吗?我最喜欢的方法是使用库,如中所示。例如: (ns tst.demo.core (:使用tupelo.core
lein test
时运行的单元测试
我注意到,在一些测试中,我们希望测试异常处理场景,并为此抛出一个异常。
问题是,它在命令行中返回一个完整的堆栈跟踪,我通常认为这是发生了不好的事情,而实际上不是
来自JS世界,我发现我们可以抑制异常,我们想在jest之类的框架中将其标记为抑制异常,leiningen或clojure对此有什么选择吗?我最喜欢的方法是使用库,如中所示。例如:
(ns tst.demo.core
(:使用tupelo.core tupelo.test))
(宠爱
(is=5(+23))
(抛出?(/10)))
结果
-----------------------------------
Clojure 1.10.3 Java 15.0.2
-----------------------------------
测试tst.demo.core
运行了包含2个断言的2个测试。
0次失败,0次错误。
如果中的表达式抛出?
未抛出异常,则它将失败。否则,这是一个合格的测试
这在引擎盖下使用try/catch
,您也可以随时手动执行
如果您确实不想使用库,可以在中使用。您需要使用如下语法:
(is (thrown? ArithmeticException (/ 1 0)))
但是,请注意,此功能很脆弱,如果您犯了错误,将不会收到任何警告。这就是为什么我编写了包装器tupelo.test/throws?
,因为它既简单又防弹
由于Tupelo库是开源的,因此如果需要,您可以随时复制源代码:
(defmacro抛出?
对clojure.test使用(抛出?…)而不是(是(抛出?…)。用法:
(抛出?(/10));抓住任何可丢弃的东西”
[&表格]
`(clojure.test/is)
(试试看
~@形式
false;如果未引发异常,则失败
(捕捉可丢弃的假人)#
对),;如果抛出任何内容,则测试成功
因此,您可以看到,
抛出的所有动作?
宏所做的就是将代码包装在try/catch中,然后将true
或false
返回到标准的clojure.test/is
表单。这很好!虽然我在clojure.test
上寻找一些解决方案/库,因为将成本转移到这个库并不是我之前要求的,但是如果我们在测试中模拟函数,并且希望被模拟的函数抛出异常,我们可以抑制它吗?用redefs通过模拟函数不会影响抛出?
宏。不,更像是,我会模拟函数抛出异常,我不会断言是否存在异常,所以我不会使用抛出的?我想测试其他一些东西,比如可能设置了一些变量,或者为实现的捕获流记录了一些东西。