2017-08-10 1 views
0

Si une étape de ma configuration de test échoue, je souhaite signaler cette défaillance et mettre fin aux tests suivants dans le bloc deftest actuel (ou dans l'espace de nom actuel). Une façon de le faire maintenant:Échec des tests sur l'échec de prédicat dans clojure.test

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

ci-dessus:

  1. Rapports échec si some-condition-is-ok n'est pas remplie
  2. ne fonctionne pas de tests, puisque la condition de configuration n'a pas été atteint

Sauf que cela ne coule pas bien, et ne fonctionne pas bien pour plusieurs conditions. Je voudrais quelque chose comme:

(let [;; setup here...] 

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

Toutes les idées sur une bonne façon de faire cela?

Répondre

1

Vous pouvez utiliser Mark Engelberg de better-cond pour cela:

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

Ou si vous voulez éviter la :let [_ ,,,], vous pouvez définir votre propre macro:

(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

Il semble comme un candidat décent comme n'a pas de dépendances autres que le noyau de clojure, bien que je n'aime toujours pas l'apparence de liaison ': let'. Upvoting parce que c'est une option raisonnable, merci pour votre réponse Sam – Josh

+0

@Josh J'ai mis à jour ma réponse pour répondre à vos deux commentaires. Auparavant, il avait une dépendance autre que le noyau de Clojure (à savoir, better-cond), mais j'ai réécrit la macro 'ceating' sans meilleur-cond, ainsi que supprimer les liaisons': let'. –

+0

Merci Sam - Je vais laisser ça ouvert un peu pour encourager d'autres réponses mais je voulais aller de l'avant et merci de le modifier – Josh