如何避免在Clojure中进行单元测试时手动评估defrecords和defprotocols?

Pau*_*ans 5 clojure

在我的Clojure代码库中,我已经定义了几个协议和几个defrecords.我正在使用clojure.test对我的defrecords中定义的具体函数进行单元测试.

例如,假设我有以下源文件:

在src/foo/protocols.clj中:

(ns foo.protocols)

(defprotocol RequestAcceptability
  (desired-accepted-charset [this]))
Run Code Online (Sandbox Code Playgroud)

在src/foo/types.clj中:

(ns foo.types
  (:use [foo.protocols :only [RequestAcceptability desired-accepted-charset]])

(defrecord RequestProcessor
  [field-1 field-2]
  RequestAcceptability
  (desired-accepted-charset [this]
    ...implementation here...))
Run Code Online (Sandbox Code Playgroud)

在test/foo/types_test.clj中:

(ns foo.types-test
  (:use [clojure.test])
  (:use [foo.protocols :only [RequestAcceptability desired-accepted-charset]])
  (:import [foo.types RequestProcessor]))

(deftest test-desired-accepted-charset_1
  ...test code here...)
Run Code Online (Sandbox Code Playgroud)

我在Emacs中使用Clojure 1.4,Leiningen 2,nrepl.

我面临的烦恼是,当我去运行单元测试时(例如,使用Cc C-,序列),我得到一个ClassNotFoundException:foo.types.RequestProcessor.为了解决这个问题,我正在进行单独评估每个协议和defrecord表单的手动工作.即,我将导航到我的protocols.clj并评估(nrepl的CMx键序列)我的defprotocol形式; 然后我将导航到我的types.clj并评估我的defrecord表单; 然后我终于能够成功运行我的单元测试而没有得到ClassNotFoundException.

当然,在我真正的代码库中,我必须为我的所有协议和defrecords做到这一点,因此它非常繁琐且耗时.另外,如果我只是简单地放入 shell并进行lein测试,我会得到相同的ClassNotFoundException.

有没有更好的办法?

感谢您的时间和帮助.

mik*_*era 4

您需要require测试命名空间中包含 defrecord 的命名空间。

(:import [foo.types RequestProcessor]))它本身不起作用,因为它只适用于类路径中已存在的 Java 类。此处的情况并非如此,因为您正在使用 defrecord 在运行时动态创建该类。

import通常仅用于 Java 互操作。