2012-09-08 17 views
5

Estoy probando el comportamiento de audio y necesito que el usuario juzgue si las cosas pasan o no. Me gustaría pedirle al usuario una respuesta dentro de una prueba de Leiningen. Pero, hay algo que sucede para leer, línea que impide esto.clojure read-line falla dentro de la prueba de Leiningen

Este es un código de ejemplo de prueba después de la creación de un nuevo proyecto con clojure "Lein nueva foo" y la edición del foo/test/archivo foo/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"))))) 

y esto es lo que sucede en una "lein test"

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

solo control-C detiene la llamada (línea de lectura).

estoy usando Clojure 1.4.0 y 2.0.0 Leiningen-preview7 en Java 1.6.0_35 de Java HotSpot (TM) de 64 bits del servidor VM

¿Alguna idea sobre cómo conseguir leer línea a trabajar en el interior ¿una prueba?

También debo señalar que (línea de leer) no funciona bien dentro "Lein repl" para mí ...

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

ACTUALIZACIÓN:

voy a dar la victoria @DaoWen en este. Leyendo los enlaces & buscando en Google, stdin solo se usa en leiningen. Con suficiente salto de aro, quizás podría resolver esto, pero la sugerencia de un cuadro de diálogo me parece el mejor camino a seguir. Dejar caer un código de prueba aquí solo para completar en caso de que esto ayude a otros.

(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

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

+0

¿Quizás lo ejecute como 'lein trampoline repl'? – Bill

+0

lein resultados de la prueba de trampolín en "Las pruebas no terminaron limpiamente". y ninguna solicitud de entrada. (nota, lein repl ya funciona para mí) –

Respuesta

2

Sé que esto no soluciona el problema read-line, pero tal vez usted puede conseguir alrededor de él sólo por el uso de un JOptionPane lugar. Si fuera un usuario que escucha varios archivos de sonido, prefiero hacer clic en o No en lugar de tener que escribir uno de los dos.

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

Actualización:

pensé que había visto algo como esto antes:

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

Parece que usted debe tratar de correr lein trampoline test en lugar de sólo en lein test para resolver los problemas de stdin.

+0

Gracias, lo tendré en cuenta @DaoWen. Puede ser una mejor forma de hacerlo, pero aún me gustaría saber qué está pasando con la línea de lectura. –

+0

@RogerAllen - Verifique el enlace que agregué a mi respuesta para ver si esa solución funciona. – DaoWen

+0

Eso parece prometedor. Gracias. Lo probaré e informaré luego. –

Cuestiones relacionadas