我正在使用音色作为日志库,但是我在用米杰测试它时遇到了问题。我有以下方法,我所要做的就是断言Will be printed是打印出来的。
(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函数上,我能够断言每2条日志中只有1条是打印出来的,这是正确的:
(fact "print info but not debug"
(core/init :info) => nil
(provided
(core/my-output-fn anything) => irrelevant :times 1))但是,我想确保正在打印的消息是Will be printed。我找不到任何办法,你会怎么做?
发布于 2016-10-18 20:37:24
@ErwinRooijakkers的想法奏效了,但@ptaoussanis on Github有充分的理由不这么做。
请注意,
timbre/vargs->margs是私有的,并提供了实现细节。它的行为可以随时在没有通知的情况下改变,强烈建议不要以任何方式依赖它。 可以使用自定义的附加程序将输出发送到便于测试分析的地方。您可以将这些附加程序设置为测试设置的一部分,并/或使用类似于timbre/with-config的东西进行适当的测试调用。
因此,我们可以添加一个把要检查的参数(level,message)传递给存根的附加器。
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))发布于 2016-10-14 17:58:17
可以使用Midje的先决条件验证函数的输入。
当您打印进入timbre/default-output-fn的timbre/default-output-fn(我是通过您的output-fn发现的)时,您会看到它有以下结构:
{:hash_ #延迟{:状态:待定,:val } 0x5ed805b1,:即时#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中,实际消息不可用。在我看到的音色代码中,我们可以看到它在一个私有函数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必须返回一个映射,否则音色会在后面的函数中抛出一个异常。
这样就可以验证“将被打印”一次,而“将不会被打印”永远不会被打印。
https://stackoverflow.com/questions/39964425
复制相似问题