设置
clojure.test
结语在于一个测试将调用断言函数,该函数直接调用一个报告函数:is
调用 report
(通过 do-report
)。函数 report
是一个多方法,允许添加或覆盖键来允许实现替代报告样式。它也是动态的,目的是在进行完整的报告系统(TAP、JUnit 等)时重新绑定。
问题
如在中出色的 kaocha 源代码 中 所讨论,这两种方法不兼容,导致诸如 kaocha 的修补程序(和猴子补丁),leiningen 的猴子补丁,Cursive 的测试运行程序由于 绑定 report
而不总是与其他工具集成,以及 其他问题。
Alessandra Sierra 曾在这 问题 上出过一本叫 Lazytest 的 clojure.test
的后续之作(我在过去的一年中已经使其复活)。她最终未能完成这个库,并且许多其他的 Clojure 测试替代品也没有像人们希望的那样成功。
鉴于 clojure.test
将一直存在,为了在不更改基本 API 的情况下使其更容易使用和适应,似乎是明智的。
潜在解决方案
将 "要重新绑定的动态变量" 与 "默认报告函数" 分离,将使库和工具更容易选择扩展 report
或完全替换它,而不用担心它们会冲突或互相干扰。这可以通过向 clojure.test
添加一个新的动态变量 *reporter*
并将 *reporter*
默认为 clojure.test/report
来实现。(report
将保持动态,这将不改变代码的正常工作。)
在实施这样的变更后,解决方案如Leiningen的猴子补丁(monkey-patching)可以简单地绑定*report*
到一个新函数,而不用担心会影响到其他库。