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

时间:2019-01-15 14:59:14

标签: unit-testing logging elixir ex-unit

背景

我有一个根据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. 是否有一种方法只能为我的测试套件中的某些测试激活日志?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

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