2012-09-08 57 views
5

我正在測試一些音頻行爲,並且我需要用戶判斷事情是否通過或失敗。我想在leiningen測試中詢問用戶的回覆。但是,有些事情發生在讀線上,阻止了這一點。clojure read-line在leiningen測試中失敗

這是一些例子測試代碼爲「雷音新富」創建一個新的Clojure項目和編輯富/測試/富/ core_test.clj文件後:

(ns foo.core-test 
    (:use clojure.test 
     foo.core)) 

(deftest a-test 
    (testing "FIXME, what a fail." 
    (let [_ (println "enter something") 
      yn (read-line)] 
     (println yn) 
     (is (= yn "y"))))) 

,這是一個發生了什麼「lein test」

lein test foo.core-test 
enter something 
hi 
there 
what 
is 
going on? 
^C 

只有control-C停止(read-line)調用。

我使用Clojure的1.4.0和Leiningen 2.0.0 preview7於Java 1.6.0_35 Java的熱點(TM)64位服務器VM

如何讓讀線在裏面工作的任何想法一個測試?

我還應該注意到,(讀線)不正常工作裏面的「雷音REPL」我...

> lein repl 
nREPL server started on port 54398 
REPL-y 0.1.0-beta8 
Clojure 1.4.0 
    Exit: Control+D or (exit) or (quit) 
Commands: (user/help) 
    Docs: (doc function-name-here) 
      (find-doc "part-of-name-here") 
    Source: (source function-name-here) 
      (user/sourcery function-name-here) 
Javadoc: (javadoc java-object-or-class-here) 
Examples from clojuredocs.org: [clojuredocs or cdoc] 
      (user/clojuredocs name-here) 
      (user/clojuredocs "ns-here" "name-here") 

user=> (println (read-line)) 
     hi 
hi 
nil 
user=> (read-line) 
     ho 
"ho" 

UPDATE:

我要去給@DaoWen勝利在這。閱讀鏈接& googling左右,stdin只是leiningen b0rken。有了足夠的箍跳,也許我可以弄清楚這一點,但對話框的建議似乎是最好的前進道路。爲了完整起見,在這裏丟棄一些測試代碼,以防止這可以幫助其他人。

(ns foo.core-test 
    (:use clojure.test 
     foo.core)) 

(import 'javax.swing.JOptionPane) 

(defn ask-yn 
    "return 0 on pass, 1 on fail" 
    [prompt] 
    (JOptionPane/showConfirmDialog nil prompt "User Input" JOptionPane/YES_NO_OPTION)) 

(deftest a-test 
    (testing "a-test" 
    (let [yn (ask-yn "did a-test pass?")] 
     (is (= yn 0))))) 

(deftest b-test 
    (testing "b-test" 
    (let [yn (ask-yn "did b-test pass?")] 
     (is (= yn 0))))) 
+0

重複? http://stackoverflow.com/questions/7707558/clojure-read-line-doesnt-wait-for-input – noahlz

+0

也許運行它爲'lein trampoline repl'? – Bill

+0

萊茵蹦牀的測試結果在「測試沒有完成乾淨。」並沒有要求輸入。 (注意,lein repl已經適用於我) –

回答

2

我知道這並不解決您的read-line的問題,但也許你可以只使用一個JOptionPane,而不是避開它。如果我是聽幾個聲音文件的用戶,我寧願點擊而不是必須鍵入其中的一個。

(import 'javax.swing.JOptionPane) 
(JOptionPane/showConfirmDialog nil "Did the test pass?" "User Input" JOptionPane/YES_NO_OPTION) 

更新:

我想我見過這樣的事情:

Why does read-line not return after hitting ENTER (seems like a hang) using lein run, but works with lein repl?

它看起來像你應該嘗試運行lein trampoline test,而不是僅僅在lein test爲了解決stdin問題。

+0

謝謝,我會記住@DaoWen。這可能是一個更好的方法,但我仍然想知道讀線會發生什麼。 –

+0

@RogerAllen - 檢查我添加到我的答案的鏈接,看看該解決方案是否有效。 – DaoWen

+0

看起來很有希望。謝謝。將嘗試一下並在稍後報告。 –