我希望使用with-redefs模拟来自STDIN的用户输入。

首先,我正在测试错误的输入,应该重新询问用户输入的内容。然后,应该给出正确的输入。

有没有一种方法可以使用with-redefs将不同的值连续绑定(bind)到给定的符号?

我正在尝试获得此功能:

(with-redefs [read-line (fn [] "HI")
              read-line (fn [] "OK")]
  (do (println (read-line)) ;; -> "HI"
      (println (read-line)))) ;; -> "OK"

最佳答案

没有具体说明,但您始终可以在某种状态下“放空lambda”!

(let [a (atom ["a" "b"])]
  (defn f []
    (let [r (first @a)]
      (swap! a rest)
      r)))

(f) ;; "a"
(f) ;; "b"
(f) ;; nil

在您的特定情况下,拥有一个可以生成“有状态”功能的函数是有意义的,因此,一个完整的示例将是:
(defn maker [l]
  (let [a (atom l)]
    (fn []
      (let [r (first @a)]
        (swap! a rest)
        r))))

(with-redefs [read-line (maker ["HI" "OK"])]
  (do (println (read-line)) ;; -> "HI"
      (println (read-line)))) ;; -> "OK"

关于unit-testing - 依次返回符号 `with-redefs`(Clojure)的不同值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48374319/

10-16 08:09