Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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
Unit testing 在Elixir中运行混合测试时抑制stderr_Unit Testing_Elixir_Elixir Mix - Fatal编程技术网

Unit testing 在Elixir中运行混合测试时抑制stderr

Unit testing 在Elixir中运行混合测试时抑制stderr,unit-testing,elixir,elixir-mix,Unit Testing,Elixir,Elixir Mix,我正在应用程序中使用几个外部进程。在测试期间,其中几个的stderr输出与我的测试消息和结果一起内联输出。我可以这样做: mix test --trace 2> error.log 然而,当我这样做的时候,我失去了所有可爱的颜色。此外,一些长生不老药的错误仍然出现,虽然不是全部(这对我来说很好) 有没有更好的方法来抑制外部程序的错误而不影响混合输出?这是个好主意吗 或者我的测试不应该与真正的命令行实用程序交互?我这样问是因为在那一点上,我真的不再清楚我在测试什么了 更新: 下面是一个简化

我正在应用程序中使用几个外部进程。在测试期间,其中几个的stderr输出与我的测试消息和结果一起内联输出。我可以这样做:

mix test --trace 2> error.log
然而,当我这样做的时候,我失去了所有可爱的颜色。此外,一些长生不老药的错误仍然出现,虽然不是全部(这对我来说很好)

有没有更好的方法来抑制外部程序的错误而不影响混合输出?这是个好主意吗

或者我的测试不应该与真正的命令行实用程序交互?我这样问是因为在那一点上,我真的不再清楚我在测试什么了

更新:

下面是一个简化的函数和测试,以更好地说明这个概念

职能:

@doc "Function takes a pre-routing rule as a string and adds it with iptables"
def addrule(pre_routing_rule)
  %Porcelain.Result{out: _output, status: status} = Porcelain.shell("sudo iptables -t nat -A #{pre_routing_rule}")
end
测试:

test "Removing a non-existent rule fails" do 
  Rules.clear
  assert {:error, :eiptables} == Rules.remove("PREROUTING -p tcp --dport 9080 -j DNAT --to-destination 192.168.1.3:9080")
end

这个测试完全通过了。然而,与测试消息内联,它还输出
iptables:No chain/target/match by the name.
。消息的确切位置也是不可预测的,总的来说,这些消息使得测试信息很难读取。然后我重定向stderr,由于某种原因,我丢失了颜色编码,这也使得很难跟踪测试结果。

我认为您应该在调用命令行实用程序时抑制这些错误消息,例如使用与问题中相同的方法

颜色的缺乏与长生不老药的作用有关:

默认情况下,[ANSI support]为false,除非Elixir在启动过程中检测到stdout和stderr都是终端


一般来说,我建议您决定如何在系统调用中处理stderr。现在的情况是,测试框架捕获了stdout,但没有捕获stderr

您可以在最初的调用中更改stderr的处理方式,请参见


一个示例函数和测试将有助于集中回答这个问题。就目前而言,除了在System.cmd调用中使用重定向stderr的提示之外,这个问题的答案太模糊了。@FredtheMagicWonderDog我已经添加了一个关于这个问题的基本说明。有帮助吗?是的,帮助很大。是的,我想是的。我只是想知道为什么我会丢失测试的颜色编码。Elixir知道它何时将文本输出到终端,何时与文件相对,并在写入文件时删除使文本着色的位。关于这一点,请参阅IO.AnsiJust附加说明。瓷器可以将stderr重定向到各种输出。但是,它只在使用Goon驱动程序时起作用。没有goon驱动程序,您只能将stderr重定向到输出(即将错误加入到stdout)。Goon是一个单独的二进制文件,您需要将它放在应用程序的路径或工作目录中。