0

背景

我有根据以下值记录消息的库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. 有没有办法只为我的测试套件中的某些测试激活日志?
4

2 回答 2

1

为什么不继续使用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

注意:如果您异步运行测试,您将遇到此问题

于 2019-01-17T02:24:48.923 回答
1

ExUnit.setup/1使用强制声明ExUnit.on_exit/2以设置环境变量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

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

于 2019-01-15T15:06:05.733 回答