首页 > 解决方案 > 在每次测试运行之前清除 Cursive REPL 状态

问题描述

一般来说,我是 Cursive 和 Clojure 的新手,在获得体面的 TDD 工作流程方面遇到了一些困难。

我的问题是后续测试运行取决于 REPL 中的状态。例如,假设您有以下代码。

(def sayHello "hello")

(deftest test-repl-state
  (testing "testing state in the repl"
      (is (= "hello" sayHello)))) 

如果您使用“Tools->REPL->Run tests in current ns in REPL”运行它,它将通过。

如果你然后像这样重构代码

(def getGreeting "hello")

(deftest test-repl-state
  (testing "testing state in the repl"
      (is (= "hello" sayHello))))  

如果你使用“Tools->REPL->Run tests in current ns in REPL”运行它,它仍然会通过(因为sayHellorepl 中仍然存在 def )。但是,测试应该失败,因为代码当前处于失败状态(sayHello未在代码中的任何地方定义)。

我尝试在 REPL 窗口中切换“将清除本地人”按钮,但这似乎无法解决问题。

如果有一种方法可以在 REPL 之外运行测试(或者在每次测试运行的新 REPL 中),我可以将其作为解决方案。

我想要的只是被测源代码和测试结果之间存在1对1的对应关系。

在此先感谢您的帮助。

标签: testingclojurecursive

解决方案


是的,旧defs 可用很烦人。我什至通常不创建测试(哎呀),但这在正常开发过程中会咬我。如果我创建一个函数,然后重命名它,然后更改它,然后不小心引用了第一个函数名称,我会得到奇怪的结果,因为它引用的是旧函数。我仍在寻找一种不涉及杀死和重新启动 REPL 的好方法。

但是,对于您的特定情况,有一些简单但较差的解决方法:

  • 打开 IntelliJ 的终端(窗口左下方的按钮)并运行lein test. 这将执行所有项目的测试并报告结果。

  • 与上述类似,您可以在 IntelliJ 之外,在项目目录中打开一个命令窗口并运行lein test,它将运行所有找到的测试。

您还可以指定使用哪个名称空间进行测试lein test <ns here>(例如lein test beings-retry.core-test),或者使用名称空间中的特定测试:only(例如lein test :only beings-retry.core-test/a-test; where a-testis a deftest)。不幸的是,这在 REPL 中不会发生,因此它会破坏工作流程。


如上所述,我所知道的唯一基于 REPL 的解决方法就是杀死 REPL:

  • “停止 REPL” (Ctrl+F2)
  • “重新连接”(Ctrl+F5)。

当然,如果你经常这样做,这很慢,而且是一个糟糕的解决方案。我很想看看其他人是否有更好的解决方案。


推荐阅读