with-redefs 函数似乎正是在 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 形式下,它会再次起作用。