目前,我在编码会话开始时在REPL中定义了以下函数:
(defn rt []
(let [tns 'my.namespace-test]
(use tns :reload-all)
(cojure.test/test-ns tns)))
每当我做出改变时,我都会重新运行测试:
user=>(rt)
这对我来说效果不错。当我删除测试时,我必须重新启动REPL并重新定义有点烦人的方法。另外,我听到过关于使用use
这样的use
函数的错误信息。所以我的问题是:
答案 0 :(得分:17)
大多数人都跑
lein test
形成一个不同的终端。这保证了文件中的内容是经过测试而不是内存中的内容。如果您更改了函数名称并仍在某处调用旧名称,则使用reload-all
会导致错误传递。
use
不是自己的问题,如果你在测试中使用更多的命名空间,它只会限制你没有任何名称冲突。只要你有一个,没关系。 答案 1 :(得分:10)
我也在我的REPL中运行测试。我喜欢这样做,因为我可以更好地控制测试,并且由于JVM已经运行,因此速度更快。但是,就像你说的那样,很容易遇到麻烦。为了清理工作,我建议您查看tools.namespace。
特别是,您可以使用clojure.tools.namespace.repl/refresh
重新加载实时REPL中已更改的文件。还有refresh-all
重新加载类路径上的所有文件。
我将tools.namespace添加到:dev
中的~/.lein/profiles.clj
个人资料中,以便每个项目都有。然后,当您运行lein repl
时,它将包含在类路径中,但它不会泄漏到项目的正确依赖项中。
当我正在进行测试时,我要做的另一件事是将它放入我的REPL并手动运行。测试只是一个无参数函数,所以你可以这样调用它们。
答案 2 :(得分:6)
$ lein midje :autotest
启动查看src和测试文件的clojure进程,重新加载关联的命名空间并运行与更改的文件相关的测试(跟踪依赖项)。我在VimShell中使用它在vim中打开一个拆分缓冲区,同时打开源文件和测试文件。我将更改写入其中一个,并且(相关)测试在拆分窗格中执行。