Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 测试时抑制记录器_Testing_Logging_Elixir - Fatal编程技术网

Testing 测试时抑制记录器

Testing 测试时抑制记录器,testing,logging,elixir,Testing,Logging,Elixir,我想知道测试时如何禁用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 [w

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

config/test.exs
文件中为记录器设置以下配置:

config:logger,级别::错误
如果没有特定于环境的配置,请在
config/config.exs
中插入以下行:

config:logger,级别:
case Mix.env do
:测试->:错误
_->:信息
结束

另一种选择是使用另一个后端来记录消息(假设
{:logger\u file\u后端,~>0.0“}
包含在
deps
部分的
mix.exs
):

config:logger,
编译时清除级别::调试,
格式:“$date$time$metadata[$level]$message\n”,
元数据:[:应用程序,:模块,:函数,:文件,:行],
后端:[{LoggerFileBackend,:info\u warn\u error}]
配置:记录器,:信息\u警告\u错误,
路径:“log/info\u warn\u error.log”、#或“/dev/null”
级别::警告

我在记录器的文档中发现了
删除后端()
函数,所以在使用
Logger.删除后端(:控制台)
在应该禁用记录器的文件中,所有记录的消息都消失了(测试正在通过)


编辑:我问了Logger开发者这个问题。显然,在测试之上使用
@moduletag:capture\u log
比删除后端要好。不管怎样,它很有效,对我来说很好。

或者使用
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

我并没有提到,但我尝试使用第一种方法,它保留了错误,并且基于警告的测试停止通过。第二种方法大致相同,所以我将尝试添加自己的后端,或者保持原样。无论如何,感谢您的回答。拥有唯一一个路径为
/dev/null
的后端正是您想要的:它会抑制到任何地方(包括控制台)的任何输出,但会使记录器的
gen\u事件
服务器处于活动状态,因此您可以测试任何您想要的内容。旁注:我觉得你想要抑制错误很奇怪。嗯,我认为当你开始测试错误时这并不奇怪。如果你为它编写了10-15个测试,那么看到这些错误消息会变得非常烦人,因为它们都会出现。这篇文章已经有几年了,而且上下文也不完全相同,但是Jose Valim建议设置为error:可能不是最好的主意。您正在删除所有日志记录--测试运行或其他。你可能不想那样做。