lein测试使用"解决&#34 ;;在REPL工作

时间:2016-03-15 02:58:55

标签: clojure leiningen

在测试使用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"))))

谢谢。

1 个答案:

答案 0 :(得分:1)

resolve使用动态绑定的ns-resolve委托给*ns* my-resolve.core/my-resolveuser=> (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>