可以使用 Midje 的as-checker先决条件来验证函数的输入。
当您打印data进入的timbre/default-output-fn(我通过您的 发现这个output-fn)时,您会看到它具有以下结构:
{:hash_ #delay[{:status :pending, :val nil} 0x5ed805b1], :instant #inst "2016-10-14T17:07:16.779-00:00", :config {:level :info, ... .
所以日志级别在data. 可以验证as-checker如下log 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, amsg-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 会在后面的函数中抛出异常。
这样可以验证“将被打印”打印一次,而“不会被打印”永远不会打印。