我使用模拟样式测试来确保我的整个应用程序正常工作。核心Clojure测试库用于测试,通过Leiningen执行。当-main
函数运行时,它定义符号以供以后在其逻辑中使用。问题是,如果我不小心使用在一个-main
测试中创建但从未在当前-main
测试中定义的符号,它仍然有一个值。我希望得到一个错误,该符号是未定义的,但似乎我的测试环境以某种方式在deftest
执行之间共享状态。我怎么处理这个?将我的所有便利驱动的符号定义移到let
语句?
答案 0 :(得分:5)
如果您def
在您的函数中使用了全局变量,那么这通常被认为是不好的做法,而且足以使用您建议的let
。
但是,您可以捕获快照命名空间的映射。
(def ns-snapshot (ns-map *ns*))
这样你的实习生符号
之后(def foo 1)
(def bar 2)
您可以确定添加内容
(reduce dissoc (ns-map *ns*) (keys ns-snapshot))
;=> {bar #'so.core/bar, foo #'so.core/foo}
取消映射
(doseq [[k v] (reduce dissoc (ns-map *ns*) (keys ns-snapshot))] (ns-unmap *ns* k))
这样您就可以再次获得所需的未定义错误
foo ;=> CompilerException ... Unable to resolve symbol: foo in this context