簡體   English   中英

為符號`with-redefs`連續返回不同的值(Clojure)

[英]Return successively different values for a symbol `with-redefs` (Clojure)

我希望使用with-redefs來模擬STDIN的用戶輸入。

首先,我正在測試不正確的輸入,這應該重新詢問用戶輸入。 然后,應該給出正確的輸入。

有沒有辦法使用with-redefs連續將不同的值綁定到給定的符號?

我正在嘗試獲得此功能:

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

不是特別的,但是你總是可以用某種狀態'讓蘭比達'!

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

為此目的,您可能會更樂意使用with-in-str

  (with-in-str "Hello"
    (println (read-line)))
  (with-in-str "There"
    (println (read-line))))

結果:

(read-line) => "Hello"
(read-line) => "There"

確保始終打開一個瀏覽器選項卡到Clojure Cheatsheet並經常閱讀!

這是一個可能有用的代碼示例我相信:

(ns project.test
  (:require [clojure.test :refer :all]))

(deftest test-user-input

  (testing "wrong input"
    (with-in-str "some wrong input"
      (is (thrown?
           SomeExceptionClass
           (call-your-function)))))

  (testing "correct input"
    (with-in-str "some correct input"
      (let [result (call-your-function)]
        (is (= result [:proper :data]))))))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM