2012-09-08 8 views
5

Ich teste etwas Audio-Verhalten und ich brauche den Benutzer zu beurteilen, ob Dinge passieren oder nicht. Ich möchte den Benutzer nach einer Antwort innerhalb eines Leiningen Tests fragen. Aber etwas passiert mit der Read-Line, die das verhindert.clojure read-line scheitert in leiningen test

Dies ist einige Beispiel Testcodes nach einem neuen clojure Projekt mit "lein neu foo" und Bearbeiten der foo/test/foo/core_test.clj-Datei erstellen:

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

und das ist, was in einem Fall "lein test"

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

Nur control-C stoppt den (Lesezeilen-) Aufruf.

Ich bin mit Clojure 1.4.0 und 2.0.0 Leiningen-preview7 auf Java 1.6.0_35 Java HotSpot (TM) 64-Bit Server VM

Alle Ideen, wie nach innen erhalten read-line zu arbeiten ein Test?

Ich möchte auch, dass (read-line) beachten fein innen funktioniert "lein repl" für mich ...

> 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:

Ich werde @DaoWen den Sieg geben darauf. Lesen Sie die Links & googeln herum, stdin ist nur b0rken auf Leiningen. Mit genügend Hoop-Jumping könnte ich das vielleicht herausfinden, aber der Vorschlag einer Dialogbox scheint der beste Weg nach vorne zu sein. Löschen Sie hier einen Testcode, nur für die Vollständigkeit, falls dies anderen hilft. um es

(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

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

+0

Vielleicht führen Sie es als "Lein Trampolin repl"? – Bill

+0

lein trampolintestergebnisse in "Tests wurden nicht sauber beendet." und keine Aufforderung zur Eingabe. (Anmerkung, lein repl funktioniert bereits für mich) –

Antwort

2

weiß, dass ich dies nicht Ihr read-line Problem nicht beheben, aber vielleicht können Sie stattdessen nur durch ein JOptionPane mit bekommen. Wenn ich mehrere Sounddateien höre, klicke ich einfach auf Ja oder Nein, anstatt eines der beiden zu tippen.

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

Update:

Ich dachte, ich so etwas wie dies gesehen hatte, vor:

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

Es sieht aus wie Sie lein trampoline test statt lein test nur laufen sollten versuchen, in Um die stdin Probleme zu lösen.

+0

Danke, ich werde das im Hinterkopf behalten @DaoWen. Es könnte ein besserer Weg sein, aber ich würde immer noch gerne wissen, was mit der Lesezeile passiert. –

+0

@RogerAllen - Überprüfen Sie den Link, den ich zu meiner Antwort hinzugefügt habe, um zu sehen, ob diese Lösung funktioniert. – DaoWen

+0

Das sieht vielversprechend aus. Vielen Dank. Werde es ausprobieren und später berichten. –