目前,《with-redefs》的文档字符串建议它在测试中使用。然而,存在许多原因说明为什么将此宏用于测试是不理想的
- `with-redefs` "绑定"不传递到新线程,因为它是一个全局突变
- 如果将原始类型提示函数重新定义为只接受对象的函数,则用户可能会遇到运行时错误
- 如果《with-redefs》的主体部分延迟(通过延迟、go块等),则该代码可能看不到新的根
- 该突变是全局的,所以它“漏”到当前作用域之外,进入可能在另一个线程中运行的其它代码
- Clojure往往拒绝全局突变,而此宏没有用
!
标记,也没有适当地警告用户关于这里提及的危险
由于这些原因,我常常遇到新用户在使用`with-redefs`时没有理解其后果。如果用户了解Vars的工作方式,所有这些行为都合理,但对于新手而言,这需要掌握很多知识。
建议
删除`with-redefs`在测试中使用的建议
增加关于全局突变和宏的并发问题的几条警告说明。