testing - 在每次测试运行之前清除 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”运行它,它仍然会通过(因为sayHello
repl 中仍然存在 def )。但是,测试应该失败,因为代码当前处于失败状态(sayHello
未在代码中的任何地方定义)。
我尝试在 REPL 窗口中切换“将清除本地人”按钮,但这似乎无法解决问题。
如果有一种方法可以在 REPL 之外运行测试(或者在每次测试运行的新 REPL 中),我可以将其作为解决方案。
我想要的只是被测源代码和测试结果之间存在1对1的对应关系。
在此先感谢您的帮助。
解决方案
是的,旧def
s 可用很烦人。我什至通常不创建测试(哎呀),但这在正常开发过程中会咬我。如果我创建一个函数,然后重命名它,然后更改它,然后不小心引用了第一个函数名称,我会得到奇怪的结果,因为它引用的是旧函数。我仍在寻找一种不涉及杀死和重新启动 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-test
is a deftest
)。不幸的是,这在 REPL 中不会发生,因此它会破坏工作流程。
如上所述,我所知道的唯一基于 REPL 的解决方法就是杀死 REPL:
- “停止 REPL” (Ctrl+F2)
- “重新连接”(Ctrl+F5)。
当然,如果你经常这样做,这很慢,而且是一个糟糕的解决方案。我很想看看其他人是否有更好的解决方案。
推荐阅读
- codeigniter - Codeigniter:index.php?按下后退按钮时删除
- csv - Java CSV:读取/写入具有多个标题行的 CSV
- uibutton - XCode 12 - iOS 14 - UIButton IBAction 不工作
- google-cloud-platform - GCP Compute Engine API 不断请求
- java - Microsoft Excel 在 CSV 文件中添加了特殊字符
- python - Django 中的模型对象创建测试失败
- oracle - 物化视图快速刷新 - 更新基表时插入和删除
- django - DRF:如何在可浏览的 api 中将相对 url 呈现为超链接?
- sequelize.js - 如何在 Vue 中使用 v-for 和两个 mysql 表来获取想要的数据?
- reactjs - 将多个 onclick 处理函数传递给子组件