2016-10-10 50 views
1

我使用Timbre作爲日誌庫,但我遇到問題,使用Midje進行測試。我有以下方法,我試圖做的是聲明Will be printed已打印。使用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://計算器.com/questions/32310619/clojure-configure-timbre-logging/32340732#32340732 –

+0

是的,我們可以看到答案繞過了pr通過使用評論:「(跟蹤」你好,音色!跟蹤「);將不會被記錄,低於當前的日誌級別。這就是我想要自動化 –

回答

1

@E rwinRooijakkers的想法工作,但@ptaoussanis on Github有一個很好的理由不這樣做。

請注意,timbre/vargs->margs是私有的,並且實現了 的詳細信息。它的行爲可以隨時改變,恕不另行通知, 強烈建議不要以任何方式依賴它。

這將是可能的使用自定義appender發送輸出的地方,方便您的測試分析。您可以將這些appender設置爲測試設置的一部分,並且/或者使用諸如timbre/with-config之類的東西來進行適當的測試調用。

因此,我們可以添加參數傳遞到檢查(levelmessage)到Stub一個appender。

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函數的輸入做實驗。

當您打印進入timbre/default-output-fndata(我通過您output-fn發現了這個)你看它的結構如下:

{:hash_ #delay [{:狀態:待定,:VAL零} 0x10ed805b1]:即時#inst「2016-10-14T17:07:16.779-00:00」,::config {:level:info,....

所以日誌級別可用data

(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)) 

現在,你想檢查郵件的內容:隨着as-checkerlog level可以如下驗證。不僅是日誌級別。

實際消息不可用於optsdata傳遞給default-output-fn。環視音色代碼,我看到它在一個專用功能vargs->margs中可用,其需要?errmsg-typevargs。該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必須返回一個地圖,否則音色拋出在後面的功能異常。

這樣,它驗證了「將印有」打印一次,「會不會印有」從不打印。

+0

非常感謝,找到'vargs-> margs'的好工作 –

+0

謝謝!雖然可能有一個更簡單的方法。在這裏:https://github.com/erooijak/timbre-midje –

+0

對我來說足夠簡單我已經合併了你的代碼 –