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