如何在某些测试中隐藏日志但在其他测试中不隐藏?

How to hide logs in some tests but not in others?

背景

我的库根据 disable_logging 的值记录消息:

unless Application.get(:my_app, :disable_logging, false), do:
  Logger.info("Hello World!")

根据MIX_ENV,我对每个设置都有一个配置:

#test.config
use Mix.Config
config :my_app, disable_logging: true

问题

这里的问题是我不希望我的测试结果中到处都是日志消息。所以,很自然地,我可以将 disable_logging 设置为 true 并完成它。

但是,如果我这样做,我无法测试是否正在调用 Logger 以及是否使用正确的值调用它:

问题

所以,鉴于此我有一些问题:

  1. 有没有办法在我 运行 测试时激活日志但不将它们输出到终端?
  2. 有没有办法只为我的测试套件中的某些测试激活日志?

声明ExUnit.setup/1 with a mandatory ExUnit.on_exit/2 to set the environment variable with Application.put_env/4.

setup do
  Application.put_env(:my_app, :disable_logging, false)

  on_exit fn ->
    Application.put_env(:my_app, :disable_logging, true)
  end

  :ok
end

我没有测试,但应该可以。

为什么不继续使用 ExUnit.CaptureLog 来抑制日志并丢弃结果?


如果您有大量测试记录到控制台并且不想对所有测试都这样做,您可以创建一个自定义 ExUnit tag,结合 @Aleksei 的回答,这样做给你。

在您的 ExUnit.Case 模板中,添加:

setup tags do
  if tags[:disable_logger] do
    Application.put_env(:my_app, :disable_logging, false)

    on_exit(fn ->
      Application.put_env(:my_app, :disable_logging, true)
    end)
  end

  :ok
end

现在您只需为要禁用日志记录的测试指定标签:

@tag disable_logger: true
test "something happens" do
  # ...
end

注意:如果你运行你的测试异步

你会遇到问题