我想在命名空间中模拟一个宏。
例如, clojure.tools.logging/error
。
我试过 with-redefs
没有运气
(def logged false)
(defmacro testerror
{:arglists '([message & more] [throwable message & more])}
[& args]
`(def logged true))
(deftest foo
...
(with-redefs
[log/error testerror]
...
这给出了这个错误:
CompilerException java.lang.RuntimeException: Can't take value of a macro
最佳答案
你不可以做这个。宏的意义在于它们在编译代码时被扩展,之后它们就消失了。包含对宏的调用的原始代码是不可恢复的。您不能在运行时追溯重新定义宏:您已经太晚了。
另一种方法,如果你想有可交换的日志实现,将使用像组件这样的东西进行依赖注入(inject),并根据你是在运行测试还是在运行你的真实程序来使用不同的日志组件。可以说这有点笨手笨脚,也许还有更简单的方法,但我不知道。
关于unit-testing - 如何在 clojure 中模拟宏进行测试?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41813656/