设置
clojure.test
是基于这样的想法:一个测试将调用一个断言函数,该函数将直接调用一个报告函数:《code>is 调用 report
(通过 do-report
)。report
是一个多态方法,允许添加或覆盖键以实现替代的报告样式。它也是动态的,意在使用完全不同的报告系统时可以进行重新绑定(例如 TAP、JUnit 等)。
问题
正如在出色的 kaocha 源代码 中讨论的那样,这两种方法不能一起工作,这导致了许多问题,例如 kaocha 的解决方案(以及猴子补丁)、leiningen的猴子补丁、Cursive 的测试运行器由于绑定 report
而不总是与其他工具集成,以及其他问题。
Alessandra Sierra 在尝试 clojure.test
的后续版本 Lazytest 时(我已在去年复活),也讨论了这个问题。她最终没有完成这个库,而且 Clojure 测试的其他许多替代方案也没有像人们期望的那样成功。
鉴于 clojure.test
将一直存在,因此明智的做法是使其更容易使用和适应,而不改变基本 api。
潜在解决方案
将“要重新绑定的动态变量”与“默认报告函数”分离,可以使库和工具更容易选择扩展report
或完全取代它,而不用担心它们会冲突或相互冲突。这可以通过向clojure.test
添加一个新的动态变量*reporter*
并默认为clojure.test/report
实现(report
将保持动态,以便不改变现有代码)。
实施这样的变更后,像Leiningen的猴子补丁(monkey-patching)只需要绑定*report*
到一个新函数,而不必担心侵犯其他库的空间。