测试时禁止记录器

Jum*_*p3r 9 testing logging elixir

我想知道如何在测试时禁用Elixir中的日志记录.在我当前的代码中,我测试记录器消息,所以我不想完全禁用它,但隐藏消息直到任何测试停止传递.

我正在使用mix和ExUnit来管理和测试我的项目.

mix test
Compiling 2 files (.ex)
.........
17:59:18.446 [warn]  Code seems to be empty
.
17:59:18.447 [warn]  Code doesn't contain HLT opcode
.
17:59:18.448 [warn]  Code doesn't contain HLT opcode

17:59:18.448 [error] Label error doesn't exist
.....

Finished in 0.07 seconds
16 tests, 0 failures
Run Code Online (Sandbox Code Playgroud)

Kel*_*all 14

使用ExUnit.CaptureLog:

import ExUnit.CaptureLog

test "example" do
   assert capture_log(fn ->
      Logger.error "log msg"
   end) =~ "log msg"
end
Run Code Online (Sandbox Code Playgroud)

或者,如果您只是想忽略任何日志,那么:

@tag capture_log: true
test "example" do
    Logger.error "log msg"
end
Run Code Online (Sandbox Code Playgroud)


Ale*_*kin 7

在您的config/test.exs文件中为记录器输入以下配置:

config :logger, level: :error
Run Code Online (Sandbox Code Playgroud)

如果您没有特定于环境的配置,请在以下行中添加以下内容config/config.exs:

config :logger, level:
  case Mix.env do
    :test -> :error
    _ -> :info
  end
Run Code Online (Sandbox Code Playgroud)

另一个选择是使用另一个后端来记录日志消息(假设{:logger_file_backend, "~> 0.0"}包含在deps部分中mix.exs):

config :logger,
  compile_time_purge_level: :debug,
  format: "$date $time $metadata[$level] $message\n",
  metadata: [:application, :module, :function, :file, :line],
  backends: [{LoggerFileBackend, :info_warn_error}]

config :logger, :info_warn_error,
  path: "log/info_warn_error.log", # or "/dev/null"
  level: :warn
Run Code Online (Sandbox Code Playgroud)


Jum*_*p3r 6

remove_backend()在 Logger 的文档中发现了函数,所以在Logger.remove_backend(:console) 应该禁用Logger 的文件中使用后 ,所有记录的消息都消失了(顺便说一下,测试正在通过)。

编辑:我问了 Logger 开发人员这个问题。显然,@moduletag :capture_log在测试之上使用比删除后端更好。无论如何,工作,对我来说很好。

  • 可能不是最好的主意。您将完全删除任何日志记录——测试运行或其他情况。你可能不想这样做。 (2认同)