3

アプリケーションでいくつかの外部プロセスを使用しています。テスト中、これらのいくつかの 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 をリダイレクトすると、何らかの理由でカラーコーディングが失われ、テスト結果を追跡するのが難しくなります。

4

2 に答える 2

2

たとえば、質問と同じ方法を使用してコマンドラインユーティリティを呼び出している時点で、これらのエラーメッセージを抑制する必要があると思います。

色の欠如は、Elixirが ANSI を検出する方法に関連しています。

[ANSI サポート] は、Elixir が起動時に stdout と stderr の両方が端末であることを検出できない限り、デフォルトで false です。

于 2015-04-23T17:34:23.707 に答える
1

一般に、システム コールで stderr を処理する方法を決定することをお勧めします。何が起こっているかというと、テスト フレームワークは stdout をキャッチしますが、stderr はキャッチしません。

最初の磁器呼び出しで stderr を処理する方法を変更できます。

磁器 API ドキュメント

于 2015-04-23T20:39:00.847 に答える