2012-09-08 11 views
5

Sto testando alcuni comportamenti audio e ho bisogno che l'utente giudichi se le cose passano o falliscono. Vorrei chiedere all'utente una risposta entro un test di leiningen. Ma, c'è qualcosa che accade a read-line che impedisce questo.read-line clojure fallito nel test di leiningen

Questo è un esempio di codice di prova dopo aver creato un nuovo progetto clojure con "Lein nuova foo" e modificare il foo/test/foo/file di 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"))))) 

e questo è ciò che accade in un "test lein"

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

solo controllo-C arresta la chiamata (lettura riga).

sto usando Clojure 1.4.0 e 2.0.0 Leiningen-preview7 su Java 1.6.0_35 di Java HotSpot (TM) a 64 bit di server VM

Tutte le idee su come ottenere lettura-line a lavorare all'interno un test?

Vorrei anche sottolineare che (lettura-line) non funzionare bene dentro "Lein repl" per me ...

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

ho intenzione di dare @DaoWen la vittoria su questo. Leggendo i collegamenti & googling in giro, stdin è solo b0rken su leiningen. Con un numero sufficiente di trilli, forse potrei capirlo, ma il suggerimento di una finestra di dialogo sembra il miglior percorso da seguire. Lasciare qui qualche codice di test solo per completezza nel caso in cui questo aiuti gli altri.

(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

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

+0

Forse eseguirlo come 'lein trampoline repl'? – Bill

+0

i risultati del test del trampolino lein in "I test non sono terminati in modo pulito". e nessuna richiesta di input. (nota, lein repl funziona già per me) –

risposta

2

So che questo non risolve il problema read-line, ma forse si può aggirare l'ostacolo da solo utilizzando un JOptionPane invece. Se fossi un utente che ascolta diversi file audio preferirei semplicemente fare clic su o No piuttosto che dover digitare uno dei due.

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

Aggiornamento:

ho pensato che avevo visto qualcosa di simile prima:

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

Sembra che si dovrebbe provare a eseguire lein trampoline test invece di lein test in per risolvere i problemi stdin.

+0

Grazie, lo terrò a mente @DaoDaoWen. Potrebbe essere un modo migliore per andare, ma mi piacerebbe ancora sapere cosa sta succedendo alla linea di lettura. –

+0

@RogerAllen - Controlla il link che ho aggiunto alla mia risposta per vedere se quella soluzione funziona. – DaoWen

+0

Sembra promettente. Grazie. Proverò e riporterò più tardi. –

Problemi correlati