3

我正在尝试使用with-redefsreify模拟 clojure 中的方法。我不知道从哪里开始使用这些。谁能给我一个模拟方法的例子吗?互联网上的文档对我没有帮助,因为此时我完全对它感到困惑。

4

2 回答 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 回答