从clojure中动态创建的名称空间查找变量
以下测试失败:从clojure中动态创建的名称空间查找变量,clojure,Clojure,以下测试失败: (ns clojure_refactoring.rename-fn-test (:use clojure.test)) (deftest test-fn-location (in-ns 'refactoring-test-fn-rename) (clojure.core/refer-clojure) (defn a [b] (inc b)) (in-ns 'clojure_refactoring.rename-fn-test) (is (not= (fi
(ns clojure_refactoring.rename-fn-test
(:use clojure.test))
(deftest test-fn-location
(in-ns 'refactoring-test-fn-rename)
(clojure.core/refer-clojure)
(defn a [b] (inc b))
(in-ns 'clojure_refactoring.rename-fn-test)
(is (not= (find-var 'refactoring-test-fn-rename/a)
nil))
(remove-ns 'refactoring-test-fn-rename))
也就是说,find var(我刚刚创建的变量,在我刚刚创建的名称空间中)返回nil。这种行为不会发生在repl上,在repl上键入测试步骤就可以了
我是做错了什么,还是这只是clojure目前无法使用的东西?更新到了一个版本,与我最初的答案相比,它似乎真正起到了预期的作用
这个版本似乎有效:
(ns clojure-refactoring.rename-fn-test
(:use clojure.test
[clojure.contrib.with-ns :only [with-ns]]))
(deftest test-fn-location
(create-ns 'refactoring-test-fn-rename)
(with-ns 'refactoring-test-fn-rename
(clojure.core/refer-clojure)
(defn a [b] (inc b)))
(is (not= (find-var 'refactoring-test-fn-rename/a)
nil))
(remove-ns 'refactoring-test-fn-rename))
此外,您确实需要将命名空间名称中出现的所有
更改为-
,而文件名则需要更改
有了这些更改,测试对我来说运行良好。(我甚至没有试过运行它,显然它在不做-
/-
更改的情况下仍然有效,但实际上,你需要这样做!这是公认的惯例,如果你不遵守它,事情就不能保证有效。)
出于某种原因,问题中的代码似乎在定义测试的命名空间中创建了Vara
,因此(find Var'clojure refactoring.rename fn test/a)
返回了一个Var,而测试失败了。在上述情况下,(find var'clojure refactoring.rename fn test/a)
按预期返回nil