.NETユニットテストランナー出力FaultException.Detail
-
10-10-2019 - |
質問
WCFサービスでいくつかのユニットテストを実行しています。このサービスは、障害応答に例外の詳細を含めるように構成されています(以下のサービス構成ファイルに)。
<serviceDebug includeExceptionDetailInFaults="true" />
テストがサーバー上に未解決の例外を引き起こす場合、完全に人口の多いサーバースタックトレースを使用して、クライアントが障害を受信します。例外を呼び出すことでこれを見ることができます ToString()
方法。問題は、これが私が試したテストランナー(Xunit、Gallio、Mstest)によって出力されていないように見えることです。それらは、例外のメッセージとStacktraceプロパティを出力するように見えます。
私が意味することを説明するために、次のユニットテストで3つのセクションを出力します。
- エラーメッセージ
- エラースタックトレース
- 標準コンソール出力(私が希望する情報が含まれています。 「障害の詳細は例外デテールに等しく、おそらくincportexceptiondetailinfaults = trueによって作成された可能性があり、その値は次のとおりです。」
public void Test()
{
try
{
service.CallMethodWhichCausesException();
}
catch (Exception ex)
{
Console.WriteLine(ex); // this outputs the information I would like
throw;
}
}
編集: ただし、各テストで例外をキャッチすることを余儀なくされ、コンソールに書き込むことを強制されていないことを好みます。 FaultException
オブジェクト Detail
財産。
例えば、
public void Test()
{
service.CallMethodWhichCausesException();
}
この情報を使用すると、テストと展開の初期段階が痛みをはるかに低くします。
私はすべてのユニットテスト内で各ユニットテストを一般的な例外ハンドラーにラップして、コンソールとrethrow(上記のように)の例外を書くことができることを知っていますが、それはこれを達成する非常に長い方法の方法のようです(そしてかなりひどく見えるでしょう)。
この情報をいつでも含める方法があるかどうかは誰もが知っていますか 未処理 例外が発生しますか?私が足りない設定はありますか?私のサービス構成には、適切な障害処理がありませんか?おそらく、いくつかのユニットテストフレームワークのために、ある種のプラグイン /アダプターを書くことができますか?おそらく、代わりに使用する必要がある別のユニットテストフレームワークがあります!
私の実際のセットアップは、開発環境のためにGallioを介して実行されたXunitユニットテストですが、Xunit GUIテストランナーを介してエンジニアを実行できるようにしたい「煙テスト」の別のスイートが書かれています(またはガリオなど)最終展開を簡素化するため。
ありがとう。
アダム
解決
解決策を見つけたと思います。 Oleg Sychは、サーバーからクライアントへの例外を透過的にマーシャルにしているWCF動作を実装し、クライアントがそこに発生したかのようにそれらを上げています。
サービス動作属性をサービス契約(インターフェイス)に追加するのと同じくらい簡単です。
このアプローチは、単一のプロセス内で実行されるように書かれた既存のコードがWCFサービスを介して配布することが決定された場合、特に有益です。これは、クライアントの例外処理に変更を必要とせずに達成できることを意味します(たとえば、 SecurityException
aを処理する代わりにクライアントに FaultException<SecurityException>
より分散したデザインに移動するとき)。
投稿はここにあります: http://www.olegsych.com/2008/07/simplifiinge-wcf-using-exceptions-as-faults/
私のWCFサービスは、basichttpbinding(相互運用性のため)にWS2007HTTPBindの混合物を使用しているため、コードにいくつかの変更を加える必要がありました(上記の投稿のコメントで述べたように)。具体的には:
の ExceptionMarshallingMessageInspector.AfterReceiveReply
:
Exception exception = faultDetail as Exception;
if (exception != null)
{
// NB: Error checking etc. excluded
// Get the _remoteStackTraceString of the Exception class
FieldInfo remoteStackTraceString = typeof(Exception).GetField(
"_remoteStackTraceString",
BindingFlags.Instance | BindingFlags.NonPublic);
// Set the InnerException._remoteStackTraceString to the current InnerException.StackTrace
remoteStackTraceString.SetValue(
exception,
exception.StackTrace + Environment.NewLine);
throw exception;
}
...そしてで ExceptionMarshallingMessageInspector.ReadFaultDetail
変更を加えて、「詳細」(WS2007HTTPBINDING」または「DEATURE」(BasichTTPBindingの場合)のいずれかに等しいローカル名を持つ詳細ノードを探すようにしました。
これが役立つことを願っています。
アダム
他のヒント
コンソール出力は、テスト結果ウィンドウの列として利用できます。
Gallioは、デフォルトでコンソールの出力を診断ログにリダイレクトします。したがって、テストレポートで直接必要な情報を表示する必要があります。
セクションで 詳細 たとえば、HTMLレポートの場合、テストツリーを展開し、テスト方法を見つけます。