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*
,这是测试使用的另一种方法。否则,该方法正是要使用的方法。谢谢