请忍受这个人为的例子,但这是我能想到的最简单的事情来重现这个问题。
(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 test
期间发生:(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)
“无法解析符号:此上下文中的某些内容”这一行让我认为
Something
出于某种原因不在上下文中,而我 eval
中的 call-foo
。但为什么只有在测试中才会出现这种情况? 最佳答案
问题是 eval
看不到上下文。您的 'Something
在 something.core
和 something.core-test
中解析,因为您已经引用了所有内容。它不会从 lein test
运行其测试的任何命名空间解析。
修复当前的问题更改
'Something
至
`Something
所以它是命名空间限定的。然后测试将运行(并失败),但这是另一个问题(
println
为一件事返回 nil
)。关于testing - clojure.test 无法从 `eval` 解析符号。在 REPL 和 lein run 中工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24806608/