2009-08-30 27 views
3

我開始一個進程並重定向錯誤流,以便能夠解析它並知道發生了什麼。我做這樣說:如何實例化DataReceivedEventArgs或能夠用數據填充它?

_proc.ErrorDataReceived += new DataReceivedEventHandler(NetErrorDataHandler); 

凡NetErrorDataHandler具有以下特徵:

private void NetErrorDataHandler(object sendingProcess, DataReceivedEventArgs errLine) 

到目前爲止,我有DataReceivedEventArgs工作,但我不知道如何測試它。目前我正在運行我正在使用的流程。您無法使用其他數據創建DataReceivedEventArgs的實例,那麼如何克服這一障礙?我現在看到如何做到這一點的唯一方法就是創建一個可以爲我完成工作的流程。但是,這不是測試目的的最佳選擇。

回答

2

你的應用程序使用DataReceivedEventArgs的數據是什麼?

您的最佳解決方案可能是將DataReceivedEventArgs與可以將數據注入到測試中的類打包,然後將其傳遞給實現方法,而不是在當前事件處理程序中執行所有工作。

讓我給你看。首先,創建自定義包裝類:

internal class CustomDataReceivedEventArgs : EventArgs 
{ 

    public string Data { get; set; } 


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

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

接下來,將事件處理程序impelmentation到新的方法:

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被封裝,如果數據屬性爲只讀,它總是空白,我該如何使用它? – 2009-08-30 17:11:23

+0

如果沒有其他想法,我會將其標記爲解決方案。但我不喜歡它來測試你將需要添加特殊的方法簽名,它將與CustomDataReceivedEventArgs一起提供一些數據。但使用數據的方式是公共接口。我不想爲了測試目的而改變它。所以它會測試我的實現,但我需要爲此創建一個特殊方法並將其公開。 – 2009-08-30 17:35:43

+1

我明白,這只是一個快速和骯髒的方式來解決不可修復的數據問題,同時對現有類進行很少的更改。 – 2009-08-30 17:57:13

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 2018-03-11 01:15:16

相關問題