请在 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*` 的当前值。
鉴于clojure.test已经具有状态性,我并不确定它如何能以不同方式工作,因为有许多“运行测试”的入口点,其中许多互相调用,那么默认绑定到*out*好评安原子个地方用户仍然能够很容易地覆盖它以适应他们的用例(如测试运行器)。
是的,我同意。我只是想遵循stu错误报告格式,提交看似有问题的行为,看看是否有人有想法。如果答案是继续使用该绑定,那我会这样做。但有一个更好的支持将会很好。
...