2012-09-08 6 views
5

私はいくつかのオーディオの動作をテストしています。物事が成功するか失敗するかを判断するためにユーザーを必要とします。私はleiningenテストの中でユーザーに応答を求めています。しかし、これを防止するread-lineには何かが起こっています。ライニングの読み取りラインがライニングのテストで失敗する

これは「レイン新しいfoo」という持つ新しいClojureのプロジェクトを作成し、FOO /テスト/ 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"))))) 

をし、これが中で何が起こりますか"lein test"

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

control-Cは(read-line)呼び出しを停止します。

VM

内部動作するようにラインを読んで取得する方法上の任意のアイデアを、私はClojureの1.4.0を使用していますし、Leiningenをは、Java 1.6.0_35は、Java HotSpot(TM)上の64ビットサーバー-preview7を2.0.0テスト?

私も...私のために細かい内部の「レイン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勝利を与えるつもりですこれに。リンクを読んで&グーグルで回って、stdinはちょうどあなたの上で悔しいです。十分なフープジャンプで、おそらく私はこれを理解することができましたが、ダイアログボックスの提案は最善の道案内のようです。テストコードを完全なものにするためにここにいくつかのテストコードをドロップすると、他人に役立ちます。

(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 trampolineのテスト結果は「テストはきれいに完了しませんでした」入力要求はありません。 (注意、lein replはすでに私のために働いています) –

答えて

2

私はこれがあなたのread-line問題が解決しないけど、多分あなただけの代わりにJOptionPaneを使用して、それを回避することができます。ユーザーが複数のサウンドファイルを聴いていた場合は、どちらか一方を入力するのではなく、はいまたはいいえをクリックするだけです。

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

更新:あなたはlein trampoline testだけではなくlein testでを実行してみなければならないように見えます

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

私は前に、私はこのような何かを見たと思いましたstdin問題を解決する

+0

ありがとう、私は@DaoWenを心に留めておきます。それは良い方法かもしれませんが、私はまだ何が起こっているのかを知りたいと思います。 –

+0

@RogerAllen - そのソリューションが機能するかどうかを調べるために、私の答えに追加したリンクを確認してください。 – DaoWen

+0

これは有望そうです。ありがとう。それを試して後で報告します。 –

関連する問題