麻烦参考Clojure单元测试中的defrecord符号?

时间:2013-09-01 17:35:38

标签: unit-testing clojure

考虑以下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不重复,因为我使用的是requirerefer,因为这个问题的答案是建议的。

编辑:以下内容也无济于事

(add (records.core/my-vector. []) 42)
(add (#'records.core/my-vector. []) 42)
(add (@#'records.core/my-vector. []) 42)

1 个答案:

答案 0 :(得分:1)

除非我的defrecord技能变得生疏,否则你首先需要命名空间,然后导入defrecord。

(:require records.core)
(:import [records.core my-vector])