请在2024 Clojure 状态调查!中分享您的想法。

欢迎!请参阅关于页面了解有关该功能的更多信息。

0 投票
测试
编辑

我正在尝试测试一个函数(foo/my-function-under-test以下)如何处理异常。具体来说,该函数调用clj-http.client/get来发送HTTP请求,如果主机不可用,我想让被测试的函数最多重试三次。如果经过三次重试后仍然无法连接到主机,我希望它抛出我的ServiceUnavailable异常。

下面的代码不正确,但它应该表达我的意图。我知道retries-count不是一个变量。我也知道我可以通过动态重新绑定让它表现得像一个变量。但有没有一种函数式的方法来做这件事而无需模拟变量?

(deftest retries
  (let [retry-count 0]
    (with-redefs [clj-http.client/get (fn [url & [req & r]]
                                        retry-count++
                                        (throw (UnknownHostException. "Some message")))]
      (is (thrown? ServiceUnavailable (foo/my-function-under-test)))
      (is (= 3 retry-count)))))

1 答案

0 投票

您可以创建一个原子变量retry-count,然后使用swap!来增加它的值。

(deftest retries
  (let [retry-count (atom 0)]
    (with-redefs [clj-http.client/get (fn [url & [req & r]]
                                        (swap! retry-count inc)
                                        (throw (UnknownHostException. "Some message")))]
      (is (thrown? ServiceUnavailable (foo/my-function-under-test)))
      (is (= 3 @retry-count)))))
...