3

私はclojureでメソッドを使用with-redefsしてモックしようとしています。reifyどこから始めればよいかわかりません。メソッドをモックする例を教えてください。この時点で完全に混乱しているため、インターネット上のドキュメントは役に立ちません。

4

2 に答える 2

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 に答える