为什么不能在 deftest 周围应用 with-redefs?



with-redefs函数似乎正是clojure测试中模拟/截断依赖关系所需要的。我正在使用clojure.test[11.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
))))

现在我意识到,mock在我所有的测试中都是通用的,所以我把它向上移动了

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


现在没有使用新的绑定,而是调用了真正的依赖项——测试失败。

我在SO上看到一些帖子提到了一些关于";直接链接";但我真的无法理解为什么它在案例1中有效,而在案例2中无效。如果我以最巧妙的形式将redefs移回,它会再次起作用。

根据文档字符串(https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/with-redefs(,其中redefs在执行主体后恢复原始值。在给定的情况下,主体定义了一个测试。因此,With redefs控制测试的定义,但不控制测试的执行。当测试执行时,任何获取下一个id的引用都会将该符号解析为其当前值,到那时,该值将是真实值,而不是mock。(从逻辑上讲:如果第一种情况成立,并且docstring成立,那么第二种情况就不能成立。(

由于评论中已经提到的原因,使用redefs通常不是首选工具。Clojure提供了更健壮的技术,例如,制作更高阶的子系统,并使用fixture对其进行配置以进行测试。

相关内容

  • 没有找到相关文章

最新更新