我正在寻找一种方法来确定是否打印了一个函数(使用println
或类似的东西)。
我想确定的是test-vars
是否打印了一些东西。
这个函数的问题在于它没有返回任何内容,但只在错误出现问题时打印出来,但我想知道它是否成功,我知道它的唯一方法就是检查如果它印有什么东西。
更好的方法是拦截"什么是 out 并将其放入变量。
在@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
所以,无论如何都输出了test-vars
个输出。然后printed
为空。
答案 0 :(得分:1)
您可以使用with-out-str
截取打印值并将其收集到字符串中:
(let [printed (with-out-str (test-vars))]
...)
答案 1 :(得分:1)
除了@ Lee的回答:一般来说,你可以将*out*
重新绑定到你想要的任何其他作家:
临时绑定:
user> (binding [*out* (java.io.StringWriter.)]
(println 101)
(str *out*))
"101\n"
只是with-out-str
线程局部绑定:
user> (set! *out* (java.io.StringWriter.))
#object[java.io.StringWriter 0x575e6773 ""]
user> (println 123)
nil
user> (str *out*)
"123\n"
这里我们重新绑定*out*
,用于当前线程(以及从中生成的所有线程,AFAIK)。