我正在尝试使用with-redefs
和reify
来模拟clojure中的方法。我不知道从哪里开始这些。任何人都可以给我一个模拟方法的例子吗?互联网上的文档对我没有帮助,因为我此时完全对它感到困惑。
答案 0 :(得分:2)
“Clojure的喜悦(Manning)”这本书可能是一个很好的起点,第13节“.22测试”有一些关于(除其他之外)你提到的技术的信息 - 使用with-redefs
宏。
答案 1 :(得分:0)
假设您想要窥探/模拟/存根函数bar
并测试函数foo
中调用的次数。一个简单的例子可能是:
(defn bar [] ...)
(defn foo []
(bar)
(bar)
(bar))
(deftest
(let [args (atom [])]
(with-redefs [bar (fn [x] (swap! args conj x))]
(foo)
(is (= (count @args) 3)))))
嗯,我同意上面的代码有点单调乏味。 您可以尝试以下宏: (我将调用历史记录放入元数据中)
(defmacro with-mock [vr & body]
`(with-redefs [~vr (with-meta
(fn [& ~'args] (swap! (-> ~vr meta :args) conj ~'args))
{:args (atom [])})]
(do ~@body)))
(with-mock bar
(foo)
(is (= (-> bar meta :args deref count)
3)))
通过一些小实用程序功能,上面的宏可以成为一个强大的工具。 Clojure的表现力如此之高。