繁体   English   中英

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

[英]clojure.test unable to resolve symbol from `eval`. Works in REPL and lein run

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

(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)

“无法解析符号:此上下文中的某些内容”这一行让我觉得,当我在call-foo evalSomething不会出于某种原因Something现在上下文中。 但为什么这只是在测试中呢?

问题是eval没有看到上下文。 你的'Somethingsomething.core 'Something .core和something.core-test因为你已经提到了所有。 它不会从lein test运行其测试的任何命名空间中lein test

解决即时问题的变化

'Something

`Something

这样它就是名称空间限定的。 然后测试将运行(并且失败),但这是另一个问题( println返回nil为一件事)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM