Clojure:如何知道函数(测试变量)是否将某些内容打印到*out*?

Clojure:如何知道函数(测试变量)是否将某些内容打印到*out*?,clojure,Clojure,我正在寻找一种方法来确定是否打印了函数(使用println或任何类似的方法) 我想确定的是testvars是否打印了一些内容 这个函数的问题是它不返回任何内容,只在错误出现问题时打印内容,但我想知道它是否成功,我看到知道它的唯一方法是检查它是否打印了内容 更好的方法是“截取”将要输出的内容并将其放入变量中 在@lee和@leetwinski的评论之后,我尝试了以下方法: (deftest test-1 (testing (is (= 1 2)))) 然后,我尝试使用以下方法运行该测试:

我正在寻找一种方法来确定是否打印了函数(使用
println
或任何类似的方法)

我想确定的是
testvars
是否打印了一些内容

这个函数的问题是它不返回任何内容,只在错误出现问题时打印内容,但我想知道它是否成功,我看到知道它的唯一方法是检查它是否打印了内容

更好的方法是“截取”将要输出的内容并将其放入变量中

在@lee和@leetwinski的评论之后,我尝试了以下方法:

(deftest test-1
  (testing
  (is (= 1 2))))
然后,我尝试使用以下方法运行该测试:

(let [printed (with-out-str (test-vars [#'test-1]))]
    (print (str "Printed size: " (count printed))))
但我得到的是:

FAIL in (test-1) (form-init505699766276988020.clj:103)
expected: (= 1 2)
  actual: (not (= 1 2))
Printed size: 0
nil
因此,
testvars
输出的内容已经被输出了。然后,
printed
为空。

您可以使用它截取打印值并将其收集到字符串中:

(let [printed (with-out-str (test-vars))]
    ...)

除了@Lee的答案外:一般来说,你可以将
*out*
重新绑定到你想要的任何其他作者:

临时绑定:

user> (binding [*out* (java.io.StringWriter.)]
        (println 101)
        (str *out*))
"101\n"
与不带str的
类似

线程本地绑定:

user> (set! *out* (java.io.StringWriter.))
#object[java.io.StringWriter 0x575e6773 ""]

user> (println 123)
nil

user> (str *out*)
"123\n"

在这里,我们为当前线程(以及由此产生的所有线程,AFAIK)重新绑定
*out*

非常感谢@leetwinski&@lee,我不知道为什么我没有想到没有str的
。它可以工作,但不适用于
测试变量
。我正在看
clojure.test
代码,我不知道为什么。我认为这与
*测试*
有关,但我不确定是什么原因。有什么想法吗?你的想法几乎是对的,而不是
*out*
,它应该是
*testout*
,这是测试使用的另一种方法。否则,该方法正是要使用的方法。谢谢