2

Timbreをロギング ライブラリとして使用していますが、 Midjeでのテストに問題があります。私は次の方法を持っています。私がやろうとしているのは、それ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。これを行う方法が見つかりません。どうしますか?

次のプロジェクトで実験を行っています https://github.com/stephanebruckert/timbre-midje

4

2 に答える 2

3

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 コードを調べてみると、 、 a 、およびvargs->margsを受け取るプライベート関数で使用できることがわかりました。メッセージが含まれています(あなたの場合、入ってくるのはたとえば.?errmsg-typevargsvargs: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 は後の関数で例外をスローします。

このようにして、「印刷されます」が一度印刷され、「印刷されない」が印刷されないことが検証されます。

于 2016-10-14T17:58:17.820 に答える