【问题标题】:Suppress Logger when testing测试时禁止记录器
【发布时间】:2018-06-08 07:47:13
【问题描述】:

我想知道如何在测试时禁用 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

【问题讨论】:

    标签: testing logging elixir


    【解决方案1】:

    在您的 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
    

    【讨论】:

    • 我没有提到,但我尝试使用第一种方法并且它保留了错误,加上基于警告的测试停止通过。第二种方式或多或少是一样的,所以我会尝试添加自己的后端或保持原样。不管怎样,谢谢你的回答。
    • 拥有路径为/dev/null 的唯一后端正是您想要的:它抑制任何输出到任何地方(包括控制台),但它会留下记录器的gen_event 服务器活着,所以你可以测试你想要的任何东西。 旁注:我觉得你想抑制错误很奇怪。
    • 嗯,我认为当您开始测试错误时这并不奇怪。如果您为它编写 10-15 次测试,那么看到所有错误消息会变得非常烦人,这些错误消息预计会出现。
    • 这篇文章有几年历史了,上下文不完全相同,但 Jose Valim 建议设置为错误:github.com/phoenixframework/phoenix/issues/898
    【解决方案2】:

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

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

    【讨论】:

    • 可能不是最好的主意。您将完全删除任何日志记录 - 测试运行或其他方式。你可能不想这样做。
    【解决方案3】:

    要么使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      相关资源
      最近更新 更多