【问题标题】:How to suppress output of exception while running unit tests in Clojure如何在 Clojure 中运行单元测试时抑制异常输出
【发布时间】:2021-08-18 13:10:44
【问题描述】:

我正在将 leiningen 用于 clojure,并且我有一套在我运行 lein test 时运行的单元测试。

我注意到在某些测试中,我们想要测试异常处理场景,为此我们抛出异常。 问题是,它会在命令行中返回一个完整的堆栈跟踪,我经常将其视为发生了不好的事情,而实际上并非如此。

来自 JS 世界,我看到我们可以抑制我们想在 jest 等框架中将其标记为抑制的异常,有没有 leiningen 或 clojure 的选项?

【问题讨论】:

    标签: unit-testing clojure leiningen


    【解决方案1】:

    我最喜欢的方法是使用tupelo.test 库,如this template project 所示。例如:

    (ns tst.demo.core
      (:use tupelo.core tupelo.test))
    
    (dotest
      (is= 5 (+ 2 3))
      (throws? (/ 1 0)))
    

    结果

    -----------------------------------
       Clojure 1.10.3    Java 15.0.2
    -----------------------------------
    
    Testing tst.demo.core
    
    Ran 2 tests containing 2 assertions.
    0 failures, 0 errors.
    

    如果throws? 中的表达式没有抛出异常,它将失败。否则就是通过测试。

    这在后台使用try/catch,您也可以随时手动执行。


    如果您真的不想使用库,您可以在clojure.test 中进行操作。您需要使用如下语法:

    (is (thrown? ArithmeticException (/ 1 0))) 
    

    但是,请注意,此功能很脆弱,如果您犯了错误,您将不会收到任何警告。这就是我编写包装器 tupelo.test/throws? 的原因,因为它既简单又防弹。

    由于 Tupelo 库是开源的,您可以随时复制源代码:

    (defmacro throws? 
      "Use (throws? ...) instead of (is (thrown? ...)) for clojure.test. Usage:
         (throws? (/ 1 0))                      ; catches any Throwable"
      [& forms]
      `(clojure.test/is
         (try
           ~@forms
           false ; fail if no exception thrown
           (catch Throwable dummy#
             true)))) ; if anything is thrown, test succeeds
    

    因此您可以看到,throws? 宏所做的所有工作就是将您的代码包装在 try/catch 中,然后将 truefalse 返回到标准的 clojure.test/is 表单。

    【讨论】:

    • 这很好!虽然我在clojure.test 上寻找一些解决方案/库,因为转移到这个库的成本将是巨大的
    • 不是我之前问的,但是如果我们在测试中模拟函数,并且希望模拟函数抛出异常,我们可以抑制它吗?
    • 通过with-redefs模拟函数不会影响throws?宏。
    • 不,更像是,我会模拟函数抛出异常,我不会断言看是否有异常,所以我不会使用@987654338 @?我想测试其他的东西,比如设置了一些变量或者为实现的捕获流记录了一些东西。
    猜你喜欢
    • 1970-01-01
    • 2012-03-02
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多