2024 Clojure 状态调查! 分享您的想法。

欢迎!关于这个平台的工作方式,请参见 关于页面 获取更多详细信息。

0
测试

开始一个套接字 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=>

这将正确打印测试结果。在另一个终端中连接到套接字 repl

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

这会导致报告打印在原始终端 repl 中,而不是套接字 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错误报告格式,提交一种可能的问题是行为,看看是否有人有想法。如果答案是继续使用该绑定,那我就这么做了。但更好的支持会更令人愉快。
...