从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))
此外,您确实需要将命名空间名称中出现的所有
更改为
-
,而文件名则需要更改

有了这些更改,测试对我来说运行良好。(我甚至没有试过运行它,显然它在不做
-
/
-
更改的情况下仍然有效,但实际上,你需要这样做!这是公认的惯例,如果你不遵守它,事情就不能保证有效。)

出于某种原因,问题中的代码似乎在定义测试的命名空间中创建了Var
a
,因此
(find Var'clojure refactoring.rename fn test/a)
返回了一个Var,而测试失败了。在上述情况下,
(find var'clojure refactoring.rename fn test/a)
按预期返回
nil