clojure read-line 在 leiningen 测试中失败

标签 clojure leiningen

我正在测试一些音频行为,我需要用户判断事情是通过还是失败。我想请用户在 leiningen 测试中做出回应。但是, read-line 发生了一些事情,可以防止这种情况发生。

这是在使用“lein new foo”创建新的 clojure 项目并编辑 foo/test/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 测试”中发生的情况
lein test foo.core-test
enter something
hi
there
what
is 
going on?
^C

只有 control-C 停止(读取行)调用。

我在 Java 1.6.0_35 Java HotSpot(TM) 64-Bit Server VM 上使用 Clojure 1.4.0 和 Leiningen 2.0.0-preview7

关于如何让 read-line 在测试中工作的任何想法?

我还应该注意到(read-line)在“lein 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"

更新:

我要让@DaoWen 赢得这场胜利。阅读链接和谷歌搜索,标准输入只是 leiningen 上的 b0rken。有了足够的跳圈,也许我可以解决这个问题,但是对话框的建议似乎是最好的前进道路。在这里删除一些测试代码只是为了完整性,以防这对其他人有帮助。
(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)))))

最佳答案

我知道这不能解决您的 read-line问题,但也许您可以通过使用 JOptionPane 来解决它反而。如果我是听多个声音文件的用户,我宁愿单击"is"或“否”,而不必键入两者之一。

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

更新:

我以为我以前见过这样的事情:

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

看起来您应该尝试运行 lein trampoline test而不仅仅是 lein test为了解决stdin问题。

关于clojure read-line 在 leiningen 测试中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334125/

相关文章:

clojure - 如何使用 Clojure 检查 TLS 证书到期日期?

clojure - 使用 lein 从 cljc 文件编译 ClojureScript

clojure - 建立需要基于构建平台的不同依赖项的 leiningen 项目的优雅方法是什么?

java - 无法从 lein 项目中的存储库导入 java 库

clojure - 99 Clojure 中的第 9 题(将连续重复的列表元素打包到子列表中)

rest - Clojure即时/解析时间戳用法

less - lein-less 未在 figwheel 启动时或 .less 文件更改时运行

clojure - (leiningen, s3-wagon-private) 如何在私有(private) S3 存储库中搜索依赖项?

shell - 如何在后台启动 lein ring 服务器?

debugging - 如何将 CIDER 的调试器附加到 Luminus Web 应用程序?