2016-09-02 22 views
0

我正在爲我的應用程序中的一個相當大的函數寫一個clojure.test單元測試。這個函數會對數據庫和外部REST服務進行多次調用並進行一些計算。 例如,我的功能進行測試是像這樣在clojure測試中,如何在測試一個函數時模擬多種方法?

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

測試這種方法的目的,我想存根出或重新定義「一些審計呼叫」和「一些 - 安全 - 請致電「。 Clojure的with-redefs-fn只能一次重新定義一種方法。

是否有一種獨立的方式來模擬被單元測試的函數中使用的多個函數?

回答

0

with-redefs適用於您想要的儘可能多的功能。以下是我實際生產測試中的一個編輯示例。

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

) 

,如果你需要重新定義所使用的是要重新定義其他功能的功能,那麼你必須巢與-REDEF呼叫。這有時會導致人們認爲with-redefs只適用於一種功能。

您可能不想使用with-redefs-fn,除非您知道您有特定的原因。

相關問題