2017-08-10 69 views
0

如果我的測試設置中的任何步驟失敗,我想將此報告爲失敗,並停止當前deftest塊(或當前名稱空間)中的任何後續測試。現在的一種方式做到這一點:對clojure中的謂詞失敗進行失敗並停止測試。

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

以上:

  1. 報告失敗,如果some-condition-is-ok不滿足
  2. 不運行任何測試,因爲設置條件不成立

除了它不流暢,並且不適合多種條件。我喜歡這樣的東西:

(let [;; setup here...] 

    (assert-or-stop-tests some-condition-is-ok) 
    ... continue with tests here 

任何想法在乾淨的方式做到這一點?

回答

1

你可以用馬克·英格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 [email protected])) 
     `(do 
     ~left 
     (ceasing [email protected]))))) 

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

這似乎是一個不錯的人選,因爲它除了clojure核心之外沒有任何依賴,儘管我仍然不喜歡':let'綁定外觀。 Upvoting,因爲這是一個合理的選擇,謝謝你的回答山姆 – Josh

+0

@Josh我已經更新了我的答案,以解決你的兩個意見。以前它確實具有Clojure核心以外的依賴關係(即,更好的cond),但是我已經改寫了「停止」宏而沒有更好的cond,並且刪除了「:let」綁定。 –

+0

謝謝薩姆 - 我會留下一點點以鼓勵其他答案,但希望繼續並感謝您修改它 – Josh