Как отключить журналы в тесте Clojure? - PullRequest
0 голосов
/ 04 июня 2019

Вопрос

Я бы хотел, чтобы черная дыра print напоминала поведение в моих тестовых телах, чтобы вывод моего журнала выглядел чистым и опрятным.

(deftest some-test
   (testing "something"
      (logless 
         (is (= 22 (test-thing 14))))))

Я ожидаю тест-звонить по номеру println и другим подобным вызовам *out* и хотел бы, чтобы те прекратили загрязнять мой тестовый вывод.

Есть ли общепризнанный способ сделать это вообще?

Я нашелэтот парень ( with-out-str ), но он захватывает строку, не совсем то, что я ищу.

Фон

Я довольно новичок в Clojure, в основном из мира JavaScript.Взрыв до сих пор!Но мне еще предстоит многому научиться.

В Clojure, а не в Clojure.script (если это важно)

1 Ответ

2 голосов
/ 04 июня 2019

Просто используйте with-out-str и игнорируйте строку.

Обратите внимание, что при этом не будут регистрироваться сообщения об ошибках или сообщения из библиотек Java. Если вы хотите захватить и / или подавить этот вывод, я написал 3 дополнительные функции в библиотеке Tupelo , которые могут оказаться полезными:

Код выглядит так:

   (defmacro with-system-err-str
     "Evaluates exprs in a context in which JVM System/err is bound to a fresh
     PrintStream.  Returns the string created by any nested printing calls."
     [& body]
     `(let [baos# (ByteArrayOutputStream.)
            ps#   (PrintStream. baos#)]
        (System/setErr ps#)
        ~@body
        (System/setErr System/err)
        (.close ps#)
        (.toString baos#)))

Если хотите, вы можете создать новый макрос примерно так:

(defmacro with-printing-suppressed
  "Evaluates exprs in a context in which JVM System/err and System/out captured & discarded."
  [& body]
  `(let [baos# (ByteArrayOutputStream.)
         ps#   (PrintStream. baos#)
         s#    (new java.io.StringWriter)]
     (System/setErr ps#)
     (System/setOut ps#)
     (binding [*err* s#
               *out* s#]
       (let [result# (do ~@body)]
         (.close ps#)
         (System/setErr System/err)
         (System/setOut System/out)
         result#))))

(defn stuff []
  (println "***** doing stuff *****")
  42)

и затем проверьте его:

  (println "calling - before")
  (is= 42 (with-printing-suppressed 
            (stuff)))
  (println "calling - after")

с результатом:

calling - before
calling - after
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...