2016-10-10 32 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

对我来说足够简单我已经合并了你的代码 –