Clojure:如何知道一个函数(test-vars)是否打印了一些东西来*out*



我正在寻找一种方法来确定函数是否打印(使用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))]
    ...)

最新更新