2009-08-30 6 views
3

私はプロセスを開始して、エラーストリームを解析して何が起こったのかを知ることができるようにリダイレクトしています。私はそれをこのようにやっている:DataReceivedEventArgsをインスタンス化する方法、またはデータを入力する方法

NetErrorDataHandlerは、次のシグネチャた
_proc.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); 

:これまでのところ、私はDataReceivedEventArgsで動作するように

private void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine) 

を持っていますが、私はそれをテストするかどうかはわかりません。現在、私は作業しているプロセスを実行しています。追加データでDataReceivedEventArgsのインスタンスを作成することはできません。どうすればこの障害を克服できますか?私が今これを行う方法を知る唯一の方法は、私にとって仕事をするプロセスを作ることです。しかし、これはテストのための最良の選択肢ではありません。

答えて

2

アプリケーションがDataReceivedEventArgsから使用するデータは何ですか?

DataReceivedEventArgsを、テスト用にデータを挿入し、現在のイベントハンドラ内ですべての作業を行う代わりに、実装メソッドに渡すことができるクラスでラップするのが最適なソリューションです。

私を見せてください。新しいメソッドにイベントハンドラimpelmentationを移動

internal class CustomDataReceivedEventArgs : EventArgs 
{ 

    public string Data { get; set; } 


    public CustomDataReceivedEventArgs(string _Data) 
    { 
     Data = Data; 
    } 

    public CustomDataReceivedEventArgs(DataReceivedEventArgs Source) 
    { 
     Data = Source.Data; 
    } 
} 

次に、::

private void NetErrorDataHandler_Implementation(object sendingProcess, 
     CustomDataReceivedEventArgs errLine) 
    { 
     //Your actual event handling implementation here... 
    } 

最後に、何もしないように、あなたのイベントハンドラを設定しますが、新しいメソッドを呼び出します。

をまず、カスタムラッパークラスを作成します

private void NetErrorDataHandler(object sendingProcess, 
     DataReceivedEventArgs errLine) 
    { 
     NetErrorDataHandler_Implementation(sendingProcess, 
      new CustomDataReceivedEventArgs(errLine)); 
    } 

さて、あなたはこのような実装を呼び出すことによって、あなたの実装をテストすることができます

 NetErrorDataHandler_Implementation(new object(), 
      new CustomDataReceivedEventArgs("My Test Data")); 
+0

:-)可能だったとは思いませんでしたクラス。それはどうですか?実際に私のクラスは、コードからわかるように、DataReceivedEventHandlerを購読しています。それで、それは、購読するための具体的なメソッドシグネチャを期待しています。 datareceivedEventArgsがラップされていても、データのプロパティが読み込み専用なので、空の場合はどうすれば使用できますか? –

+0

他のアイデアがなければ、それを解決策としてマークします。しかし、私はあなたが 'CustomDataReceivedEventArgsで動作する特別なメソッドのシグネチャを追加する必要があることをテストするのが好きではありません。しかし、データを扱う方法はパブリック・インターフェイスです。私はテスト目的のために変更したくありません。だから私の実装をテストするが、私はそれのための特別なメソッドを作成し、それを公開する必要があります。 –

+1

これは、既存のクラスをほとんど変更しないうちに、設定できないデータの問題を回避するためのすばやく汚れた方法でした。 –

7

私は、内部コンストラクタを使用してオブジェクトを作成し、内部フィールドを設定できることを知りました。明らかに、これは落胆されますが、短期間の嘲笑のためにはうまくいくでしょう。ここでは例です:など

private DataReceivedEventArgs CreateMockDataReceivedEventArgs(string TestData) 
    { 

     if (String.IsNullOrEmpty(TestData)) 
      throw new ArgumentException("Data is null or empty.", "Data"); 

     DataReceivedEventArgs MockEventArgs = 
      (DataReceivedEventArgs)System.Runtime.Serialization.FormatterServices 
      .GetUninitializedObject(typeof(DataReceivedEventArgs)); 

     FieldInfo[] EventFields = typeof(DataReceivedEventArgs) 
      .GetFields(
       BindingFlags.NonPublic | 
       BindingFlags.Instance | 
       BindingFlags.DeclaredOnly); 

     if (EventFields.Count() > 0) 
     { 
      EventFields[0].SetValue(MockEventArgs, TestData); 
     } 
     else 
     { 
      throw new ApplicationException(
       "Failed to find _data field!"); 
     } 

     return MockEventArgs; 

    } 

用途:

DataReceivedEventArgs TestEventArgs = CreateMockDataReceivedEventArgs("Test"); 

...これは、研究のビットを取った、私はそれは申し訳ありません、とラップ

+0

これは答えにする必要があります。 – erhan355

関連する問題