lein test
返回函数(resolve (symbol "a-fn"))
的函数时, a-fn
会抛出NullPointerException。从REPL开始,测试运行良好。
如果确实存在问题,我无法在leiningen的测试套件中找到解决a-fn
的方法。
我创建了一个名为my-resolve的Leiningen项目lein new my-resolve
,并为它们添加了两个函数和测试:
的src / my_resolve / core.clj:
(ns my-resolve.core)
(defn a-fn [] "From a-fn")
(defn my-resolve [] (resolve (symbol "a-fn")))
测试/ my_resolve / core_test.clj:
(ns my-resolve.core-test
(:require [clojure.test :refer :all]
[my-resolve.core :refer :all]))
;; Passes
(deftest a-fn-test
(testing "a-fn"
(is (= (a-fn)
"From a-fn"))))
;; my-resolve-test behaves correctly in the REPL (the test passes,
;; returns nil) but throws a NullPointerException when called from
;; lein test.
(deftest my-resolve-test
(testing "my-resolve"
(is (= ((my-resolve))
"From a-fn"))))
谢谢。
答案 0 :(得分:1)
resolve
使用动态绑定的ns-resolve
委托给*ns*
my-resolve.core/my-resolve
,user=> (doc resolve)
-------------------------
clojure.core/resolve
([sym] [env sym])
same as (ns-resolve *ns* symbol) or (ns-resolve *ns* &env symbol)
中的my-resolve
调用将取决于从哪个名称空间调用:
my-resolve.core
我认为在REPL中,您在lein test
ns时调用my-resolve.core-test
。当*ns*
在(the-ns 'user)
中执行测试时,my-resolve
会动态绑定到{{1}},并且ns(最有可能)不包含对{{1}}的绑定。< / p>