2017-12-27 408 views
0

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

进入你的config/test.exs文件把下面的配置记录程序:

config :logger, level: :error 

如果您还没有具体的环境CONFIGS,把下面的行放在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 
+0

我没有提到,但我试过使用第一种方法,它保存了错误,加上基于警告的测试停止了传递。第二种方式或多或少是同一件事,所以我会尝试添加自己的后端或者将它保留原样。无论如何,谢谢你的回答。 – Jump3r

+0

只有具有路径'/ dev/null'的后端才会执行_exactly_您想要的操作:它将抑制任何输出到任何地方(包括console),但它会使记录器的gen_event服务器保持活动状态,因此您可以测试任何您想要的内容。 _Sidenote:_我觉得你想要抑制错误很奇怪。 – mudasobwa

+0

嗯,我认为这在开始测试错误时并不奇怪。如果你为它编写10-15个测试,看到这个预期会出现的所有错误消息变得非常烦人。 – Jump3r

0

我在记录仪的文档斑remove_backend()功能,所以在文件中使用 Logger.remove_backend(:console) 其中记录程序后应该被禁用,每个记录的消息都消失了(测试正在通过)。

编辑:我问Logger开发这个问题。显然,最好在测试之上使用@moduletag :capture_log而不是删除后端。无论如何,工作,对我来说很好。

+0

可能不是最好的主意。你正在删除任何日志 - 测试运行或其他。你可能不想这样做。 –