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