2014-07-17 52 views
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是不是在上下文中由於某種原因而我evalcall-foo。但爲什麼只在測試中出現這種情況?

回答

3

問題是eval沒有看到上下文。您的'Something將在something.coresomething.core-test中解決,因爲您已引用全部。它不會從lein test運行測試的任何名稱空間中解析出來。

要解決眼前的問題變化

'Something 

`Something 

所以它是合格的命名空間。測試將運行(並失敗),但這是另一個問題(println返回nil的一件事)。

+0

感謝您爲我澄清這一點。不知道如何使用反向符號來限定命名空間。我會修正這個例子,所以':foo'返回args的向量而不是調用'println'。 – veidt