2024 年 Clojure 调查! 中分享您的想法。

欢迎!请参阅 关于 页面获取更多有关此信息的工作方式。

0
测试

启动 socket repl

clojure -A:socket2
Clojure 1.10.3
user=> (require '[clojure.test :as t])
nil
user=> (t/deftest foo (t/is (= 1 2)))
#'user/foo
user=> (foo)

FAIL in (foo) (NO_SOURCE_FILE:1)
expected: (= 1 2)
  actual: (not (= 1 2))
nil
user=>

这能正确地打印测试结果。在另一个终端中,连接到 socket repl

% nc localhost 60606
user=> (foo)
nil
user=>

这会导致报告在原始终端 repl 中打印,而不是 socket repl 中。

但是如果您绑定,可以保留您的测试结果

user=> (binding [t/*test-out* *out*] (foo))

FAIL in (foo) (NO_SOURCE_FILE:1)
expected: (= 1 2)
  actual: (not (= 1 2))
nil
user=>

1 个答案

0

我认为这是“如设计”的,并且有些扩展 clojure.test 行为的工具依赖于它。The clojure.test ns 的文档字符串中有以下几点说明

SAVING TEST OUTPUT TO A FILE

   All the test reporting functions write to the var *test-out*.  By
   default, this is the same as *out*, but you can rebind it to any
   PrintWriter.  For example, it could be a file opened with
   clojure.java.io/writer.

有一个 with-test-out 宏,它是专门用于测试报告器以便它们可以依赖于此行为的

(defmacro with-test-out
  "Runs body with *out* bound to the value of *test-out*."
  {:added "1.1"}
  [& body]
  `(binding [*out* *test-out*]
     ~@body))
我有点同意你的观点。但这是一个它没有去到 `*out*` 的例子。它去了其他人的 `*out*`,因为第一个需要 clojure.test 的人将 `*out*` 设置了而不是使用 `*out*` 的当前值。
鉴于clojure.test已经具有状态性,我不是很清楚它如何能够以不同的方式工作,因为存在许多“运行测试”的入口点,其中一些相互调用,那么默认的到*out*的绑定如何安全地出现,使用户仍能轻松地为其用例(如测试运行器)覆盖它?
我同意。我只是想遵循stu bug report格式,提交看起来像是bug的行为,看看是否有人有想法。如果答案是保持使用该绑定,那我就这么做。但能有更好的支持会更好。
...