测试时如何禁用日志记录器

18

我想知道如何在 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
3个回答

29

可以使用 ExUnit.CaptureLog

import ExUnit.CaptureLog

test "example" do
   assert capture_log(fn ->
      Logger.error "log msg"
   end) =~ "log msg"
end

或者,如果您只想忽略任何日志,则:

@tag capture_log: true
test "example" do
    Logger.error "log msg"
end

这个答案非常完美。谢谢! - undefined

9

请将以下内容添加到您的config/test.exs文件中,以配置记录器:

config :logger, level: :error

如果您没有特定于环境的配置,请将以下行放入您的config/config.exs中:
config :logger, level:
  case Mix.env do
    :test -> :error
    _ -> :info
  end

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

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

我没有提到,但是我尝试了第一种方法,它仍然保留了错误,并且基于警告的测试停止通过了。第二种方法或多或少是相同的,所以我会尝试添加自己的后端或者就像现在这样放置。无论如何,谢谢你的回答。 - Jump3r
只有路径为/dev/null的后端可以完全做到你想要的:它可以抑制任何输出(包括控制台),但是它会保持记录器的gen_event服务器处于活动状态,这样你就可以测试任何你想要的东西。顺便说一句,我觉得你想要抑制错误很奇怪。 - Aleksei Matiushkin
好的,我认为当你开始测试错误时,这并不奇怪。如果你写了10-15个测试用例,看到所有这些预期出现的错误消息就会变得非常恼人。 - Jump3r
这篇文章已经几年了,而且并不完全是相同的上下文,但Jose Valim建议将其设置为错误:https://github.com/phoenixframework/phoenix/issues/898 - skwidbreth

7

我在Logger的文档中发现了remove_backend()函数,因此在需要禁用Logger的文件中使用Logger.remove_backend(:console)后,每个记录的消息都消失了(顺便说一下,测试也通过了)。

编辑:我问过Logger的开发人员这个问题。显然,在测试的顶部使用@moduletag :capture_log比删除后端更好。不管怎样,它能正常工作,对我来说很好。


2
可能不是最好的主意。您正在删除所有日志记录 - 包括测试运行或其他情况。您可能不想这样做。 - Onorio Catenacci
谢谢!正好是我在寻找的东西。 - Baruh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接