对clojure.test中的谓词失败进行失败并停止测试

时间:2017-08-10 00:05:58

标签: clojure

如果我的测试设置中的任何步骤失败,我想将此报告为失败,并停止当前deftest块(或当前命名空间)中的任何后续测试。现在就这样做的一种方法是:

(if some-condition-is-ok
  (do
    ... do tests)
  (is (= 1 0) "Failure, condition not met")

以上:

  1. 如果未达到some-condition-is-ok则报告失败
  2. 由于未满足设置条件,因此未运行任何测试
  3. 除了它不能很好地流动,并且在多种情况下不能很好地工作。我喜欢这样的事情:

    (let [;; setup here...]
    
      (assert-or-stop-tests some-condition-is-ok)
      ... continue with tests here
    

    有关干净方法的任何想法吗?

1 个答案:

答案 0 :(得分:1)

你可以使用Mark Engelberg的better-cond

(require '[better-cond.core :as b]
         '[clojure.test :refer [is]])

(def some-condition-is-ok true)

(def some-other-condition-is-ok false)

(deftest a-test
  (b/cond
    :let [#_"setup here..."]
    :when (is some-condition-is-ok)
    :let [_ (is (= 0 1))]
    :when (is some-other-condition-is-ok)
    :let [_ (is (= 1 2))]))

或者如果你想避开:let [_ ,,,],你可以定义自己的宏:

(defmacro ceasing [& exprs]
  (when-let [[left & [right & less :as more]] (seq exprs)]
    (if (= :assert left)
      `(when (is ~right)
         (ceasing ~@less))
      `(do
         ~left
         (ceasing ~@more)))))

(deftest b-test
  (let [#_"setup here..."]
    (ceasing
      :assert some-condition-is-ok
      (is (= 0 1))
      :assert some-other-condition-is-ok
      (is (= 1 2)))))