如何防止Clojure测试之间的符号污染?

use*_*027 3 testing tdd unit-testing clojure leiningen

我使用模拟样式测试来确保我的整个应用程序正常工作.核心Clojure测试库用于测试,通过Leiningen执行.当-main函数运行时,它定义符号以供以后在其逻辑中使用.问题是,如果我不小心使用在一个-main测试中创建但从未在当前-main测试中定义的符号,它仍然具有值.我希望得到一个错误,该符号是未定义的,但似乎我的测试环境以某种方式在deftest执行之间共享状态.我怎么处理这个?将我所有便利驱动的符号定义移到一个let语句中?

A. *_*ebb 5

如果你def在你的功能中使用全局变量,那通常被认为是不好的做法和理由足以let按照你的建议使用.

但是,您可以捕获快照命名空间的映射.

(def ns-snapshot (ns-map *ns*))
Run Code Online (Sandbox Code Playgroud)

这样你的实习生符号之后

(def foo 1)
(def bar 2)
Run Code Online (Sandbox Code Playgroud)

您可以确定添加内容

(reduce dissoc (ns-map *ns*) (keys ns-snapshot))
;=> {bar #'so.core/bar, foo #'so.core/foo}
Run Code Online (Sandbox Code Playgroud)

并取消映射它们

(doseq [[k v] (reduce dissoc (ns-map *ns*) (keys ns-snapshot))] (ns-unmap *ns* k))
Run Code Online (Sandbox Code Playgroud)

这样你就可以再次获得所需的未定义错误

 foo ;=> CompilerException ... Unable to resolve symbol: foo in this context
Run Code Online (Sandbox Code Playgroud)