2012-09-08 31 views
5

Tôi đang thử nghiệm một số hành vi âm thanh và tôi cần người dùng đánh giá xem mọi thứ có vượt qua hay không. Tôi muốn yêu cầu người dùng trả lời trong một bài kiểm tra leiningen. Nhưng, có điều gì đó xảy ra với dòng đọc để ngăn chặn điều này.không đọc được đường dây bên trong thử nghiệm leiningen

Đây là một số ví dụ mã kiểm tra sau khi tạo một dự án mới với clojure "Lein foo mới" và chỉnh sửa foo/test/foo/core_test.clj file:

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

và đây là những gì xảy ra trong một "lein test"

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

chỉ điều khiển-C dừng cuộc gọi (đọc).

Tôi đang sử dụng Clojure 1.4.0 và 2.0.0 Leiningen-preview7 trên Java 1.6.0_35 Java HotSpot (TM) 64-Bit Server VM

Bất kỳ ý tưởng về cách để có được read-line để làm việc bên trong bài kiểm tra?

Tôi cũng nên lưu ý rằng (read-line) không hoạt động tốt bên trong "Lein repl" cho tôi ...

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

tôi sẽ cung cấp cho @DaoWen chiến thắng về điều này. Đọc các liên kết & googling xung quanh, stdin chỉ là b0rken trên leiningen. Với đủ hoop-nhảy, có lẽ tôi có thể con số này ra, nhưng đề nghị của một hộp thoại có vẻ như con đường tốt nhất về phía trước. Thả một số mã thử nghiệm ở đây chỉ để hoàn thành trong trường hợp điều này giúp người khác.

(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

Trùng lặp? http://stackoverflow.com/questions/7707558/clojure-read-line-doesnt-wait-for-input – noahlz

+0

Có thể chạy nó như 'lein trampoline repl'? – Bill

+0

kết quả thử nghiệm lein trampoline trong "Kiểm tra không hoàn thành sạch." và không có yêu cầu đầu vào. (lưu ý, lein repl đã hoạt động cho tôi) –

Trả lời

2

Tôi biết điều này không khắc phục vấn đề read-line của bạn, nhưng có lẽ bạn có thể khắc phục nó bằng cách chỉ sử dụng một JOptionPane để thay thế. Nếu tôi là người dùng đang nghe một số tệp âm thanh, tôi chỉ muốn nhấp vào hoặc Không thay vì phải nhập một trong hai.

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

Cập nhật:

tôi nghĩ rằng tôi muốn nhìn thấy một cái gì đó như thế này trước đây:

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

Dường như bạn nên cố gắng chạy lein trampoline test thay vì chỉ lein test trong để giải quyết các vấn đề stdin.

+0

Cảm ơn, tôi sẽ ghi nhớ điều đó @DaoWen. Nó có thể là một cách tốt hơn để đi, nhưng tôi vẫn muốn biết những gì đang xảy ra với dòng đọc. –

+0

@RogerAllen - Kiểm tra liên kết tôi đã thêm vào câu trả lời của mình để xem giải pháp đó có hoạt động hay không. – DaoWen

+0

Điều đó có vẻ đầy hứa hẹn. Cảm ơn. Sẽ dùng thử và báo cáo lại sau. –

Các vấn đề liên quan