mmag

ハマったことメモなど

ExUnitで不要なログを出力させないようにする

前回のエントリで、ExUnitには色々と便利なタグがあるということを書きました。

今日は、そのうちの1つcapture_logについて書きます。

使い所

例えばJWTを扱うためのライブラリjokenは、不正なトークンを与えると以下の様なログを吐きます。

21:17:51.385 [warn] Error: {:badarg, ["aaaaaaaaa"]}

ただ、不正なトークンが付いたリクエストでは認証されないということをテストしたいこともあるでしょう。するとテストの出力はこうなります。

$ mix test
.................................21:17:51.385 [warn] Error: {:badarg, ["aaaaaaaaa"]}
.............................................21:17:51.745 [warn] Error: {:badarg, ["aaaaaaaaaaaaaaa"]}
...

Finished in 1.2 seconds
81 tests, 0 failures

このログは運用上は意味があるかもしれませんが、テストでは不要です。この警告を出しているテストにcapture_logタグを付けることで抑制できます。

@tag :capture_log
test "returns error tuple when token is invalid" do
  assert {:eror, _} = Jwt.decode("aaaaaaaaa")
end

ただしテストがfailした場合には、以下のように、どんなログが補足されたか示されます。

1) test decode/1 returns error tuple when token is invalid (MyApp.JwtTest)
   test/lib/jwt_test.exs:31
   match (=) failed
   code: {:eror, _} = Jwt.decode("aaaaaaaaa")
   rhs:  {:error, "Could not verify token"}
   stacktrace:
     test/lib/jwt_test.exs:32: (test)

   The following output was logged:
   21:37:02.903 [warn] Error: {:badarg, ["aaaaaaaaa"]}

なお、ログを補足してそれをテストしたいときは、ExUnit.CaptureLogモジュールを使います。