gpt4 book ai didi

unit-testing - 如何使用 with-redefs 模拟对同一函数的多次调用?

转载 作者:行者123 更新时间:2023-12-04 05:12:38 26 4
gpt4 key购买 nike

我希望能够模拟 MyFunction 但是我需要模拟在 MyFunction 被调用时返回不同的值。

是否可以使用with-redefs根据函数的调用顺序返回不同的值?

(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)))))

最佳答案

您可以使用返回值的可变集合,然后在每次调用时从中返回/删除值。

(defn foo [x] (inc x)) ;; example fn to be mocked

如果您想模拟对 foo 的三个调用,分别返回 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! 来获取原子的旧/新值,但需要 Clojure 1.9 或更高版本。

如果你没有 swap-vals! 你可以这样做(不那么原子):

(with-redefs [foo (let [results (atom [1 2 3])]
(fn [_]
(let [result (first @results)]
(swap! results rest)
result)))]
...)

关于unit-testing - 如何使用 with-redefs 模拟对同一函数的多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53050046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com