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 行为的工具依赖于这一点。clojure.test 名空间字符串说明中有以下内容

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*` 的当前值。
by
鉴于clojure.test已经具有状态,我真的不确定它如何能有所不同,因为有多个“运行测试”入口点,其中一些相互调用了彼此,因此默认绑定到* out*可以在用户仍能够轻松覆盖其用例(如测试运行器)的方式下安全发生在哪里。
by
是的,我同意。我只是想遵循 stu bug report 格式,提交可能是有问题的行为,看看是否有人有什么想法。如果答案是继续使用此绑定,那么我会这样做。但更好的支持会很不错。
...