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

时间:2014-04-16 02:08:57

标签: unit-testing testing clojure tdd leiningen

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

1 个答案:

答案 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