我正在尝试使用with-redefs
和reify
模拟 clojure 中的方法。我不知道从哪里开始使用这些。谁能给我一个模拟方法的例子吗?互联网上的文档对我没有帮助,因为此时我完全对它感到困惑。
问问题
1335 次
2 回答
3
“The Joy of Clojure (Manning)”一书可能是一个很好的起点,“13.2 测试”部分有一些关于(除其他外)您提到的技术的信息 - 使用with-redefs
宏。
于 2014-02-13T19:55:03.253 回答
1
假设您想监视/模拟/存根一个函数bar
并测试它在 function 中被调用了多少次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 的表现力非常棒。
于 2017-01-07T09:44:07.993 回答