首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Midje测试音色日志输出

用Midje测试音色日志输出
EN

Stack Overflow用户
提问于 2016-10-10 18:21:00
回答 2查看 398关注 0票数 2

我正在使用音色作为日志库,但是我在用米杰测试它时遇到了问题。我有以下方法,我所要做的就是断言Will be printed是打印出来的。

代码语言:javascript
复制
(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条是打印出来的,这是正确的:

代码语言:javascript
复制
(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项目中做实验

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-18 20:37:24

@ErwinRooijakkers的想法奏效了,但@ptaoussanis on Github有充分的理由不这么做。

请注意,timbre/vargs->margs是私有的,并提供了实现细节。它的行为可以随时在没有通知的情况下改变,强烈建议不要以任何方式依赖它。 可以使用自定义的附加程序将输出发送到便于测试分析的地方。您可以将这些附加程序设置为测试设置的一部分,并/或使用类似于timbre/with-config的东西进行适当的测试调用。

因此,我们可以添加一个把要检查的参数(levelmessage)传递给存根的附加器。

core.clj

代码语言:javascript
复制
(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

代码语言:javascript
复制
(: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
EN

Stack Overflow用户

发布于 2016-10-14 17:58:17

可以使用Midje的先决条件验证函数的输入。

当您打印进入timbre/default-output-fntimbre/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

代码语言:javascript
复制
(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))

现在,您需要检查消息的内容。不仅仅是日志级别。

在传递给optsdatadefault-output-fn中,实际消息不可用。在我看到的音色代码中,我们可以看到它在一个私有函数vargs->margs中可用,它需要一个?err、一个msg-type和一个vargsvargs包含消息(在您的例子中,进来的是:auto :p ["The message"]) )。

通过as-checker方法,可以验证以下消息:

代码语言:javascript
复制
(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必须返回一个映射,否则音色会在后面的函数中抛出一个异常。

这样就可以验证“将被打印”一次,而“将不会被打印”永远不会被打印。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39964425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档