簡體   English   中英

為什么不能在 deftest 周圍應用 with-redefs?

[英]Why can't with-redefs be applied around a deftest?

with-redefs function 似乎正是在 clojure 測試中模擬/存根依賴項所需要的。 我正在使用 clojure.test [1.10.1]

最初它給了我很多悲傷,當我運行測試時沒有應用新的綁定。 最后我得到了以下設置按預期工作。 其他命名空間需要依賴項

(ns abc 
  (:require [anotherns.id-gen-mock :as mock])

(deftest test-buy
  (testing "Appends trade to the trades log"
    (let [mock (atom {})]
      (with-redefs [id-gen/get-next-id  mock/get-next-id
                    save-trade          (fn [t] (reset! mock {:trade t}))]
          ... test code

  ))))

現在我意識到,我所有的測試都可以使用模擬,所以我把它向上移動了。

(with-redefs [id-gen/get-next-id  mock/get-next-id
              save-trade          identity]
  (deftest test-holdings
    (testing "after 1 buy"
      ... test code
        
        

現在沒有使用新的綁定,調用了真正的依賴項——測試失敗。

我看到一些關於 SO 的帖子提到了一些關於“直接鏈接”的內容,但我無法理解為什么它在 Case1 中有效,但在 Case2 中無效。 如果我將 with-redefs 移回 deftest 表單下,它會再次起作用。

根據文檔字符串( https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/with-redefs ),with-redefs 執行主體后恢復原始值。 在給定的情況下,主體定義了一個測試。 因此,with-redefs 控制測試的定義,但不控制它們的執行。 當測試執行時,任何對 get-next-id 的引用都會將該符號解析為其當前值,到那時它將是真實的,而不是模擬的。 (這在邏輯上是這樣的:如果 case No.1 成立,並且 docstring 成立,那么 case No.2 不能成立。)

由於評論中已經提到的原因,with-redefs 通常不是首選工具。 Clojure 提供了更強大的技術,例如,制作高階子系統並使用夾具對其進行配置以進行測試。

暫無
暫無

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

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