我想在命名空间中模拟一个宏。

例如, 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/

10-12 23:48