2

WCF サービスでいくつかの単体テストを実行しています。サービスは、障害応答に例外の詳細を含めるように構成されています (私のサービス構成ファイルには次のものがあります)。

<serviceDebug includeExceptionDetailInFaults="true" />

テストによってサーバー上で未処理の例外が発生した場合、完全に設定されたサーバー スタック トレースを使用して、クライアントが障害を受け取ります。これは、例外のToString()メソッドを呼び出すことで確認できます。問題は、これが私が試したどのテスト ランナー (xUnit、Gallio、MSTest) でも出力されないように見えることです。それらは、例外の Message および StackTrace プロパティを出力するだけのようです。

私が何を意味するかを説明するために、次の単体テストは 3 つのセクションを出力します。

  • エラーメッセージ
  • エラー スタック トレース
  • 標準コンソール出力 (必要な情報が含まれています。たとえば、「Fault Detail は、IncludeExceptionDetailInFaults=true によって作成された可能性が高い ExceptionDetail と等しく、その値は次のとおりです: ...」

public void Test()
{
    try
    {
        service.CallMethodWhichCausesException();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex); // this outputs the information I would like
       throw;
    }
}

編集:ただし、 オブジェクトのプロパティ内のコンテンツを確認するために、各テストで例外をキャッチしてコンソールに書き込むことを余儀なくされないようにしたいと思います。FaultExceptionDetail

例えば、

public void Test()
{
    service.CallMethodWhichCausesException();
}

この情報があれば、テストと展開の初期段階での負担が大幅に軽減されます。

各単体テストを一般的な例外ハンドラーでラップし、例外をコンソールに書き込み、すべての単体テスト内で (上記のように) 再スローできることはわかっていますが、これを達成するには非常に長い方法のようです (そして、かなりひどく見えるでしょう)。 )。

未処理の例外が発生するたびにこの情報を含める方法があるかどうかは誰にもわかりませんか? 不足している設定はありますか? サービス構成に適切な障害処理が欠けていますか? おそらく、何らかのユニット テスト フレームワーク用の何らかのプラグイン/アダプターを作成できますか? おそらく、代わりに使用する必要がある別の単体テスト フレームワークがあります。

私の実際のセットアップは、開発環境用に Gallio を介して実行される xUnit ユニット テストですが、エンジニアに xUnit GUI テスト ランナー (またはGallio など) を使用して、最終的な展開を簡素化します。

ありがとう。

アダム

4

3 に答える 3

1

私は解決策を見つけたと思います。Oleg Sych は、サーバーからクライアントに例外を透過的にマーシャリングし、クライアントで例外が発生したかのように例外を発生させる WCF 動作を実装しました。

サービス動作属性をサービス コントラクト (インターフェイス) に追加するのと同じくらい簡単です。

このアプローチは、単一のプロセス内で実行するように記述された既存のコードを WCF サービス経由で配布する必要がある場合に特に役立ちます。これは、クライアントの例外処理を変更する必要なく実現できることを意味します (たとえば、より分散した設計に移行するときにSecurityException、 a を処理する代わりに、クライアントでa を処理することができます)。FaultException<SecurityException>

投稿はここにあります: http://www.olegsych.com/2008/07/simplifying-wcf-using-exceptions-as-faults/

私の WCF サービスは (相互運用性のために) ws2007HttpBinding と basicHttpBinding を組み合わせて使用​​しているため、コードにいくつかの変更を加える必要がありました (上記の投稿のコメントで述べたように)。具体的には:

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 「Detail」(ws2007HttpBinding の場合) または「detail」(basicHttpBinding の場合) のいずれかに等しいローカル名を持つ詳細ノードを検索するように変更を加えました。

これが役立つことを願っています。

アダム

于 2011-01-12T11:05:52.973 に答える
0

デフォルトでは、Gallio はコンソール出力を診断ログにリダイレクトします。そのため、必要な情報がテスト レポートに直接表示されます。

たとえば、HTML レポートの[詳細]セクションで、テスト ツリーを展開し、テスト メソッドを見つけます。

Gallio テスト レポートのコンソール出力

于 2011-01-12T06:51:28.627 に答える
0

コンソール出力は、[テスト結果] ウィンドウの列として利用できます。

于 2011-01-12T04:22:17.663 に答える