现有的clojure.test/use-fixtures
函数在广泛应用场景中工作得相当好,但我经常发现自己需要编写附加到特定测试集的函数,需要将这些测试移动到新的命名空间或手动在测试中扩展工具函数。这些方案存在一些问题
如果在一个新的命名空间中
- 为新命名空间命名?我该如何确保其他开发者知道在哪里查找它?
- 将所有侧重于相同功能的测试分割开来,使得难以看到整体视图。
- 为了避免在测试文件中引入依赖项,其他公共工具函数需要移动到自己的新命名空间中。
如果手动扩展
- 包装逻辑的引入掩盖了实际的测试焦点。
- 使用多个工具函数包装起来很繁琐(很多缩进)。
- 重构/重新排序多个工具函数也很繁琐(不像在向量中来回移动符号)。
请求
我希望看到一些能够让工具函数附加到特定测试的机制。这已经被社区的一些库实现(例如,fixa 和 kaocha),但这些通常需要使用他们自己定制的clojure.test/deftest
实现以解决功能的缺乏(fixa)或实现自己的钩子系统(kaocha)。
可能的解决方案
- 模仿fixa的方式,工具函数可以通过元数据附加到
deftest
上。
- 添加一个新函数/宏,如
testing
,它接受一个工具函数集合并应用它们到所有嵌套的deftest
。这将依赖于一个动态变量,并随着嵌套的发生推送/弹出工具函数
元数据示例
(deftest ^{:fixtures [fixture-a]} some-test
(is (= 1 2)))
新宏
(with-fixtures [fixture-a fixture-b]
(deftest some-test
(is (= 1 2))))