Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在Clojure中运行单元测试时抑制异常输出_Unit Testing_Clojure_Leiningen - Fatal编程技术网

Unit testing 如何在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

我将leiningen用于clojure,我有一套在运行
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通过
模拟函数不会影响
抛出?
宏。不,更像是,我会模拟函数抛出异常,我不会断言是否存在异常,所以我不会使用
抛出的
?我想测试其他一些东西,比如可能设置了一些变量,或者为实现的捕获流记录了一些东西。