2016-09-02 1 views
0

J'écris un test d'unité clojure.test pour une fonction assez grande dans mon application. Cette fonction effectue plusieurs appels aux services REST db et externes et effectue des calculs. par exemple, ma fonction à tester est comme siDans le test clojure, comment simuler plusieurs méthodes lors du test d'une fonction?

(defn myfunc [id] 
    (let[ 
     w (some-security-call id) 
     x (some-db-call id) 
     y (some-REST-call x) 
     z (some-audit-call y) 

     ] 
     (-> y :somekey))) 

dans le but de tester cette méthode, je veux bouchonner ou redéfinir « certains appellent l'audit- » et «certains-sécurité- appelez ". Le de Clojure with-redefs-fn ne fait que redéfinir une méthode à la fois.

Existe-t-il une méthode standard pour simuler plusieurs fonctions utilisées dans une fonction testée à l'unité?

Répondre

0

with-redefs Fonctionne sur autant de fonctions que vous le souhaitez. Voici un exemple expurgé de mes tests de production réels.

(with-redefs [namespace/redacted   (constantly []) 
       namespace/redacted     (fn [& args] (async/go namespace/redacted)) 
       namespace/redacted  (constantly [2 4]) 
       namespace/redacted    (fn [& args] (namespace/redacted sample-redacted-ads)) 
       namespace/redacted    (fn [_ _ redacted & _] 
                (async/go (cond-> namespace/redacted 
                   namespace/redacted (dissoc redacted)))) 
       namespace/redacted     (fn [& args] (async/go nil)) 
       namespace/redacted  fake-redacted 
       namespace/redacted  fake-redacted 
       namespace/redacted  namespace/redacted 
       namespace/redacted  (go (constantly [])) 
       namespace/redacted    (fn [_] []) 
       namespace/redacted  namespace/redacted 
       namespace/redacted  namespace/redacted 
       namespace/redacted      (fn [_] {:redacted "redacted"})] 
    (is (= "redacted" 
     (get-in (<!! 
       ) 
       )) 
     "We should return the redacted if we don't pass it in") 
    ... many more tests here ... 

) 

si vous avez besoin de redéfinir une fonction qui est utilisée par une autre fonction que vous voulez redéfinir alors vous devez imbriquer les appels vers des-REDEF. cela amène parfois les gens à penser que with-redefs ne fonctionne qu'avec une seule fonction.

Vous ne souhaitez probablement pas utiliser with-redefs-fn à moins que vous ne connaissiez une raison spécifique.