2017-08-10 12 views
0

テストのセットアップに失敗した場合は、これを失敗として報告し、現在のdeftestブロック(または現在の名前空間)で後続のテストを中止します。今これを行う1つの方法:clojure.testの述語エラーのテストの失敗と中断

(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

をそれはそれとして、まともな候補のように思えます私はまだ ':let'バインディングの外観が嫌いですが、clojureコア以外の依存関係はありません。それは合理的なオプションであるので、あなたの答えに感謝します。サム – Josh

+0

@ジョシュ私は両方のあなたのコメントに答えるために私の答えを更新しました。これまではClojureのコア(つまりcond-cond)以外の依存関係を持っていましたが、 ':let'バインディングを削除するだけでなく、より良いcondを使わずに' ceasing'マクロを書き直しました。 –

+0

Samさん、ありがとうございます - 私はこれを少し開いておき、他の回答を促しますが、先に進んでいただき、ありがとうございました – Josh

関連する問題