簡體   English   中英

在Clojure測試中,測試一個功能時如何模擬出多種方法?

[英]In clojure test, how to mock out multiple methods when testing one function?

我正在為我的應用程序中的相當大的功能編寫clojure.test單元測試。 該函數對數據庫和外部REST服務進行了多次調用,並進行了一些計算。 例如,我要測試的功能就是這樣

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

為了測試此方法,我想存根或重新定義“ some-audit-call ”和“ some-security-call ”。 Clojure的with-redefs-fn一次只能重新定義一種方法。

有沒有一種標准的方法可以模擬正在單元測試的功能中使用的多個功能?

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

)

如果需要重新定義要重新定義的另一個函數使用的函數,則必須嵌套對with-redef的調用。 這有時會使人們認為with-redef僅適用於一個功能。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM