【发布时间】:2018-01-21 20:50:52
【问题描述】:
我正在尝试在 Clojure 中测试“井字游戏”命令行游戏,并希望重新定义使用 read-line 模拟用户输入的函数。但是,with-redefs 没有像我预期的那样工作,而且(似乎)与其他测试不同。
这是我的测试
(ns game.setup-test
(:require [clojure.test :refer :all]
[clojure.string :as st]
[game.helpers :as gh]
[game.setup :refer :all]))
(deftest initial-setup-test
(testing "Can set initial options"
(with-redefs [get-game-type-input (fn [] "1")
get-marker-input (fn [] "X")
get-starter-input (fn [] "1")]
(do (initial-setup my-game)
(is (= :human (get-in @my-game [:player1 :type])))
(is (= :human (get-in @my-game [:player2 :type])))
(is (= [:player1 :player2] (get @my-game :up-next)))
(is (= "X" (get-in @my-game [:player1 :marker])))
(is (= "O" (get-in @my-game [:player2 :marker])))))))
这是我在setup.clj 中的函数定义
(ns game.setup)
(defn get-input [requestor validator]
(fn [] (do (requestor)
(if-let [input (validator (read-line))]
input
(recur)))))
(def get-marker-input (get-input request-p1-marker valid-marker?))
(def get-game-type-input (get-input request-game-type valid-type?))
(def get-starter-input (get-input request-starter-type valid-starter?))
(def set-starter
(partial set-game-option
get-starter-input
starter-opts
swap-merge
print-starter-player))
(defn initial-setup [game-state]
(do (set-game-type game-state)
(set-player-markers game-state)
(set-starter game-state)))
(defn set-game-option [input-getter attr-opts updater printer game]
(-> (input-getter) ; gets user input
attr-opts ; returns corresponding update-map
(#(updater game %)) ; updates the game-state with update-map
printer)) ; prints the updated game-state
运行此测试时。我仍然看到 request-* 函数的 STDOUT 输出,并且测试等待输入到 STDIN。
所以,我假设with-redefs 没有像我预期的那样“重新定义”get-* 函数。
按我预期工作的不同测试
(deftest get-marker-input-test
(testing "Reads perfect input"
(with-redefs [read-line (fn [] "X")]
(is (= "X" (get-marker-input))))))
感谢任何帮助! :)
【问题讨论】:
-
我认为可能还有其他问题。你的
with-redefs看起来不错,我无法重现。也许发布你的其余代码(initial-setup等),或者做一个最小的复制案例。如果您已经在此代码上迭代了一段时间,也请尝试重新启动您的 REPL。 -
刚试过重启。没有影响。
-
我可能会尝试从 9 恢复到 Java 8... 9 还存在一些其他问题。如果解决了问题,我会通知您。
标签: unit-testing clojure