Testing clojure.test无法解析“eval”中的符号。在REPL和lein run中工作

Testing clojure.test无法解析“eval”中的符号。在REPL和lein run中工作,testing,clojure,eval,Testing,Clojure,Eval,请容忍这个人为的例子,但这是我能想到的最简单的事情来重现这个问题 (ns something.core) (defn call-foo [something & args] (let [a-foo (:foo (eval (:quux something)))] (apply a-foo args))) (def Something { :foo (fn [& args] args) :bar (fn [something] (call-foo somet

请容忍这个人为的例子,但这是我能想到的最简单的事情来重现这个问题

(ns something.core)

(defn call-foo [something & args]
  (let [a-foo (:foo (eval (:quux something)))]
    (apply a-foo args)))

(def Something {
  :foo (fn [& args] args)
  :bar (fn [something] (call-foo something))
})

(defn make-something []
  {:quux 'Something})
在REPL中或使用
lein run
运行以下命令效果良好

(let [subject (make-something)                      
      actual (call-foo subject "hello" "greetings")]
  (println actual))                                 
;;=> (hello greetings)
该问题仅在该测试和执行lein测试期间出现:

(ns something.core-test
  (:require [clojure.test :refer :all]
            [something.core :refer :all]))

(deftest a-test
  (let [subject (make-something)
        actual  (call-foo subject "hello" "greetings")]
    (is (= ["hello" "greetings"] actual))))
这会抛出一个错误。输出示例:

ERROR in (a-test) (Compiler.java:6464)
Uncaught exception, not in assertion.
expected: nil
  actual: clojure.lang.Compiler$CompilerException: java.lang.RuntimeException: Unable to resolve symbol: Something in this context, compiling:(/private/var/folders/0n/c7q7860j34xfc2r1x4q51jrh0000gn/T/form-init9215140948330409114.clj:1:6436)

“无法解析符号:此上下文中的某个内容”这一行让我认为
某个内容由于某种原因不在上下文中,而我
调用foo
中评估
。但为什么只有在测试中才会出现这种情况?

问题在于
eval
看不到上下文。您的
'Something
Something.core
Something.core测试中解析,因为您引用了所有。它不会从
lein test
运行其测试的任何名称空间解析

要解决当前的问题,请更改

'Something


因此它是命名空间限定的。然后测试将运行(并失败),但这是另一个问题(
println
返回
nil
)。不知道如何使用反勾号限定命名空间。我还将修复该示例,以便
:foo
返回args的向量,而不是调用
println
`Something