在Clojure中模拟现有方法

时间:2014-02-12 20:57:15

标签: clojure mocking reify

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

2 个答案:

答案 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的表现力如此之高。