现有的clojure.test/use-fixtures
函数对于广泛的用例运行良好,但我的确经常遇到只想将函数附加到一组测试的情况,不得不将这些测试移动到新的命名空间或手动在测试中展开fixture。这些解决方案存在一些问题
如果在新的命名空间中
- 给新命名空间起什么名字?我怎样才能确保其他开发者知道在哪里找它?
- 将关注同一功能的测试分开使得难以看到全局
- 为了避免引入其他测试文件,需要将其他常见fixture移动到它们自己的新命名空间。
如果手动展开
- 封装逻辑的包含影响了实际的测试焦点。
- 用多个fixture包裹起来很麻烦(有很多缩进)。
- 重新组织/排序多个fixture很麻烦(不像在向量中来回移动符号)。
请求
我希望看到将fixture附加到特定测试的某种机制。这已通过各种社区库(例如,fixa和kaocha)实现,但这些通常需要使用他们对clojure.test/deftest
的定制实现来规避缺乏功能(fixa)或实现自己的钩子系统(kaocha)。
可能的解决方案
- 效仿fixa的方法,可以将fixture通过元数据附加到
deftest
上。
- 可以添加一个新函数/宏,类似
testing
,它接受一组fixture并将它们应用到所有嵌套的deftest
。将依赖于动态变量,并在嵌套发生时添加和删除fixture。
元数据示例
(deftest ^{:fixtures [fixture-a]} some-test
(is (= 1 2)))
新宏
(with-fixtures [fixture-a fixture-b]
(deftest some-test
(is (= 1 2))))