4
請耐心等待這個人爲的例子,但這是我能想到的最簡單的事情來重新創建問題。clojure.test無法解析來自`eval`的符號。在REPL中運行並運行
(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
。但爲什麼只在測試中出現這種情況?
感謝您爲我澄清這一點。不知道如何使用反向符號來限定命名空間。我會修正這個例子,所以':foo'返回args的向量而不是調用'println'。 – veidt