考虑以下leiningen项目core.clj
文件
(ns records.core)
(defn hello [] "hello")
(defprotocol my-sequence
(add [seqq item]))
(defrecord my-vector [coll]
my-sequence
(add [_ item] (conj coll item)))
我可以编译它并在REPL中测试它,如下所示:
records.core> (hello)
"hello"
records.core> (add (my-vector. []) 42)
[42]
但是当我将其转录到leiningen单元测试文件中时如下:
(ns records.core-test
(:require [clojure.test :refer :all]
[records.core :refer :all]))
(deftest a-test
(testing "adding to a my-vector"
(is (= (hello) "hello"))
#_(is (= [42] (add (my-vector. []) 42)))))
第一个测试成功,显示符号hello
已正确移入records.core-test
命名空间,但my-vector
的测试会引发编译错误(删除#_
上面的第二行):
clojure.lang.Compiler$CompilerException: java.lang.IllegalArgumentException:
Unable to resolve classname: my-vector, compiling:
(.../records/test/records/core_test.clj:8:22)
这似乎与this SO question不重复,因为我使用的是require
和refer
,因为这个问题的答案是建议的。
编辑:以下内容也无济于事
(add (records.core/my-vector. []) 42)
(add (#'records.core/my-vector. []) 42)
(add (@#'records.core/my-vector. []) 42)
答案 0 :(得分:1)
除非我的defrecord技能变得生疏,否则你首先需要命名空间,然后导入defrecord。
(:require records.core)
(:import [records.core my-vector])