如何使用 with-redefs 模拟对同一函数的多次调用?
How can I use with-redefs to mock multiple calls to the same function?
我希望能够模拟 MyFunction
但是在调用 MyFunction
时我需要模拟 return 不同的值。
是否可以根据函数的调用顺序使用with-redefs
到return不同的值?
(testing "POST /foo/bar and return ok"
(with-redefs [->Baz (fn [_]
(reify MyProtocol (MyFunction [_] [{:something 1}]))
(reify MyProtocol (MyFunction [_] [{:something 2}])))]
(let [response (routes/foo {:request-method :post
:uri "/foo/bar"
:query-params {}
})]
(is (= (:status response) 200)))))
您可以使用 return 值的可变集合,然后在每次调用时从中使用 return/remove 值。
(defn foo [x] (inc x)) ;; example fn to be mocked
如果您想分别模拟对 foo
returning 1、2 和 3 的三个调用:
(with-redefs [foo (let [results (atom [1 2 3])]
(fn [_] (ffirst (swap-vals! results rest))))]
(prn (foo 0))
(prn (foo 0))
(prn (foo 0))
;; additional calls would return nil
(prn (foo 0)))
;; 1
;; 2
;; 3
;; nil
使用 swap-vals!
获取原子的 old/new 值,但需要 Clojure 1.9 或更高版本。
如果你没有 swap-vals!
你可以像这样(不那么原子地)这样做:
(with-redefs [foo (let [results (atom [1 2 3])]
(fn [_]
(let [result (first @results)]
(swap! results rest)
result)))]
...)
我们为此使用 Picomock,并对每次调用的参数进行断言,并对调用次数进行断言。推荐!
我希望能够模拟 MyFunction
但是在调用 MyFunction
时我需要模拟 return 不同的值。
是否可以根据函数的调用顺序使用with-redefs
到return不同的值?
(testing "POST /foo/bar and return ok"
(with-redefs [->Baz (fn [_]
(reify MyProtocol (MyFunction [_] [{:something 1}]))
(reify MyProtocol (MyFunction [_] [{:something 2}])))]
(let [response (routes/foo {:request-method :post
:uri "/foo/bar"
:query-params {}
})]
(is (= (:status response) 200)))))
您可以使用 return 值的可变集合,然后在每次调用时从中使用 return/remove 值。
(defn foo [x] (inc x)) ;; example fn to be mocked
如果您想分别模拟对 foo
returning 1、2 和 3 的三个调用:
(with-redefs [foo (let [results (atom [1 2 3])]
(fn [_] (ffirst (swap-vals! results rest))))]
(prn (foo 0))
(prn (foo 0))
(prn (foo 0))
;; additional calls would return nil
(prn (foo 0)))
;; 1
;; 2
;; 3
;; nil
使用 swap-vals!
获取原子的 old/new 值,但需要 Clojure 1.9 或更高版本。
如果你没有 swap-vals!
你可以像这样(不那么原子地)这样做:
(with-redefs [foo (let [results (atom [1 2 3])]
(fn [_]
(let [result (first @results)]
(swap! results rest)
result)))]
...)
我们为此使用 Picomock,并对每次调用的参数进行断言,并对调用次数进行断言。推荐!