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