2016-10-10 5 views
1

Я использую Timbre в качестве библиотеки регистрации, но у меня проблемы с тестированием Midje. У меня есть следующий метод, и все, что я пытаюсь сделать, это утверждение, что печатается Will be printed.Тестирование выходов журнала Timbre с Midje

(defn init [level] 
    (timbre/merge-config! {:output-fn my-output-fn}) 
    (timbre/set-level! level) 
    (timbre/info "Will be printed") 
    (timbre/debug "Won't be printed")) 

По оберточной (timbre/default-output-fn) вокруг функции моего собственного my-output-fn, я могу утверждать, что только 1 из 2 журналов печатаются, что это правда:

(fact "print info but not debug" 
    (core/init :info) => nil 
    (provided 
     (core/my-output-fn anything) => irrelevant :times 1)) 

Однако я хотел бы сделать убедитесь, что напечатанное сообщение - Will be printed. Я не могу найти способ сделать это, что бы вы сделали?

Я делаю эксперименты в следующем проекте https://github.com/stephanebruckert/timbre-midje

+0

Хотя я не знаком с мошки, вы смотрели на этот вопрос: Http: // StackOverflow .com/questions/32310619/clojure-configure-timbre-logging/32340732 # 32340732 –

+0

Да, и мы можем видеть, что ответ получил вокруг oblem, используя комментарий: '(trace" Hello, Timbre! trace "), не будет регистрироваться ниже текущего уровня журнала. Это то, что я хочу автоматизировать. –

ответ

1

@e Идея rwinRooijakkers работала, но у @ptaoussanis on Github есть все основания не делать этого.

Обратите внимание, что timbre/vargs->margs является закрытым, а реализация подробно. Его поведение может измениться в любое время без уведомления, настоятельно рекомендует не зависеть от него каким-либо образом.

Можно было бы использовать пользовательский appender, который отправляет выходные данные, которые удобны для анализа ваших тестов. Вы можете настроить эти приложения как часть вашей тестовой установки и/или использовать что-то вроде timbre/with-config для соответствующих тестовых вызовов.

Таким образом, мы можем добавить к appender'у, который проходит параметры для проверки (levelmessage) к заглушке.

core.clj

(defn init 
    ([level] 
    (init level {})) 
    ([level config] 
    (timbre/merge-config! config) 
    (timbre/set-level! level) 
    (timbre/info "will be printed") 
    (timbre/debug "won't be printed"))) 

core_test.clj

(:require [timbre-midje.core :as core] 
      [midje.sweet :refer :all])) 

(defn log-stub [level message]) 

(def log-stub-appender 
    {:appenders 
    {:test-appender 
     {:enabled? true 
     :fn (fn [data] (log-stub (:level data) (:vargs data)))}}}) 

(fact "print info but not debug" 
    (core/init :info log-stub-appender) => nil 
    (provided 
    (log-stub :info ["will be printed"]) => irrelevant :times 1 
    (log-stub :debug ["won't be printed"]) => irrelevant :times 0)) 
2

можно подтвердить ввод с помощью функции Midje-х as-checker prerequisite.

При печати data, которые приходят в timbre/default-output-fn (я узнал об этом через ваш output-fn) вы видите, имеет следующую структуру:

{: hash_ #delay [{: Статус: в ожидании,: Вэл ноль } 0x5ed805b1]: мгновенное #inst "2016-10-14T17: 07: 16.779-00: 00",: {конфигурации: уровень: информация, ....

Таким образом, журнал уровня доступен в data. С as-checkerlog level может быть подтверждено следующим образом:

(fact "print info but not debug" 
     (core/init :info) => nil 
     (provided 
     (timbre/default-output-fn anything ; opts is first argument 
           (as-checker (fn [data] 
               (= (-> data :config :level) ; get log level 
                :info))))  ; validate that it is info 
     => anything :times 1) 
     (provided 
     (timbre/default-output-fn anything 
           (as-checker (fn [data] 
               (= (-> data :config :level) 
                :debug)))) 
     => anything :times 0)) 

Теперь вы хотели, чтобы проверить содержание сообщения. Не только уровень журнала.

Фактическое сообщение недоступно в opts или data по направлению default-output-fn. Оглядываясь в коде Timbre, я видел, что он доступен в частной функции vargs->margs, которая принимает ?err, msg-type и vargs. vargs содержит сообщение (в вашем случае, что приходит в это, например :auto :p ["The message"])

Через as-checker подхода сообщение может быть проверено следующим образом:.

(fact "print Will be printed, not Won't be printed" 
     (core/init :info) => nil 
     (provided 
     (#'timbre/vargs->margs anything anything ["Will be printed"]) => {} :times 1) 
     (provided 
     (#'timbre/vargs->margs anything anything ["Won't be printed"]) => {} :times 0)) 

Обратите внимание, что vargs->margs должен вернуть карту, в противном случае Timbre бросает исключение в более поздней функции.

Таким образом, это подтверждено, что «будет напечатано» печатается один раз, и «не будет печататься» никогда не печатается.

+0

Большое спасибо за хорошую работу по поиску' vargs-> margs' –

+0

Спасибо, может быть, проще. здесь: https://github.com/erooijak/timbre-midje. –

+0

Простой для меня. Я уже объединил ваш код! –