Clojure:如何知道函数(test-vars)是否打印出* out *?

时间:2016-05-27 13:58:34

标签: clojure

我正在寻找一种方法来确定是否打印了一个函数(使用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为空。

2 个答案:

答案 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)。

相关问题