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
clojure.test中谓词失败的Fail和Stop测试_Clojure - Fatal编程技术网

clojure.test中谓词失败的Fail和Stop测试

clojure.test中谓词失败的Fail和Stop测试,clojure,Clojure,如果测试设置中的任何步骤失败,我希望将其报告为失败,并停止当前deftest块(或当前命名空间)中的任何后续测试。现在有一种方法可以做到这一点: (if some-condition-is-ok (do ... do tests) (is (= 1 0) "Failure, condition not met") 上述: 如果某些条件正常未满足,则报告故障 不运行任何测试,因为不满足设置条件 除了它不能很好地流动,而且在多种情况下也不能很好地工作。我想要一些像: (let [;

如果测试设置中的任何步骤失败,我希望将其报告为失败,并停止当前
deftest
块(或当前命名空间)中的任何后续测试。现在有一种方法可以做到这一点:

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

  • 如果
    某些条件正常
    未满足,则报告故障
  • 不运行任何测试,因为不满足设置条件
  • 除了它不能很好地流动,而且在多种情况下也不能很好地工作。我想要一些像:

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

    有什么干净的方法可以做到这一点吗?

    你可以用马克·恩格尔伯格的:

    (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)))))
    

    它似乎是一个不错的候选者,因为它除了clojure core之外没有其他依赖项,尽管我仍然不喜欢
    :let
    绑定外观。向上投票,因为这是一个合理的选择,谢谢你的回答Sam@Josh我已经更新了我的答案以回应你的两个评论。以前它确实有Clojure core以外的依赖项(即better cond),但我重写了
    停止
    宏而不使用better cond,并删除了
    :let
    绑定。谢谢Sam--我将暂时保留此选项,以鼓励其他答案,但我想继续,感谢您修改它