请分享您的看法参与 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
by

我相信这是“按设计”,并且一些扩展 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))
by
我有点同意你的看法。但是这是一个例子,它没有去到 `*out*`。因为它去到了别人设置的 `*out*` 而不是使用 `*out*` 的当前值。
by
鉴于clojure.test已经具有状态性,我不确定它会如何不同运行,因为有许多“运行测试”入口点,其中一些相互调用,那么默认将*out*绑定到哪个地方是安全可用的,以便用户仍能轻松地为其用例(如测试运行器)覆盖它?
by
我同意。我只是想遵循stu的错误报告格式,提交类似问题的行为,看看是否有任何想法。如果答案是继续使用绑定,那么我会这样做。但是,更好的支持将会有所帮助。
...