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

欢迎!请您查看关于页面以获取有关如何工作的更多信息。

0
测试
编辑

我想测试一个函数(下文的foo/my-function-under-test)是否能如预期处理异常。具体来说,该函数调用clj-http.client/get发起HTTP请求,如果主机不可用,我想要被测试的函数最多重试3次。如果在3次重试后仍然无法连接到主机,我想要该函数抛出我的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设为一个原子(atom),然后使用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)))))
...