目前,《with-redefs》的文档字符串建议在测试中使用。然而,有多个原因说明使用此宏进行测试不是最佳选择。
- `with-redefs`的"绑定"不会转移到新线程,因为这是一个全局变更。
- 如果用户将原始类型提示函数重新定义为仅接受对象的函数,则可能会在运行时遇到错误。
- 如果`with-redefs`的主体部分被延迟(使用延迟、go 块等),则该代码可能看不到新的根。
- 由于这是一个全局变更,所以它会"泄漏"到当前作用域之外,进入可能正在另一个线程中运行的代码中。
- Clojure倾向于避免全局变更,但此宏既没有标记为`!`,也没有正确警告用户这里提到的危险。
由于这些原因,我经常遇到新用户在不理解这样做的影响的情况下使用`with-redefs`。如果用户了解Vars的工作原理,这些行为都有意义,但对于新用户来说,这需要掌握大量的知识。
建议
删除关于在测试中使用`with-redefs`的建议
添加一些关于全局变更和宏的并发问题的警告。