アプリケーションでいくつかの外部プロセスを使用しています。テスト中、これらのいくつかの stderr 出力は、テスト メッセージと結果とインラインで出力されます。私がすることができます:
mix test --trace 2> error.log
しかし、そうすると、私の素敵な色がすべて失われます。また、すべてではありませんが、いくつかの Elixir エラーがまだ表示されます (これは私にとっては問題ありません)。
ミックス出力に影響を与えることなく、外部プログラムのエラーを抑制するより良い方法はありますか? それは良い考えですか?
それとも、実際のコマンド ライン ユーティリティと実際に対話しないようにテストする必要がありますか? その時点で、私が何をテストしているのかが正直にわからなくなったので、私は尋ねます.
アップデート:
以下は、概念をよりよく説明するための単純化された関数とテストです。
関数:
@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 that name.
。メッセージの正確な位置も予測できず、これらのメッセージがまとまると、テスト情報が非常に読みにくくなります。次に、stderr をリダイレクトすると、何らかの理由でカラーコーディングが失われ、テスト結果を追跡するのが難しくなります。