现有的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))))