[英]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.