2011-01-11 59 views
2

我正在WCF服務上運行一些單元測試。該服務配置爲在故障響應中包含異常詳細信息(在我的服務配置文件中包含以下內容)。.NET單元測試運行器輸出FaultException.Detail

<serviceDebug includeExceptionDetailInFaults="true" /> 

如果測試引起故障是由客戶端收到一個完全填充的服務器堆棧跟蹤在服務器上未處理的異常。我可以通過調用例外的ToString()方法來看到這一點。問題是,這似乎不是由我嘗試過的任何測試運行器輸出(xUnit,Gallio,MSTest)。它們似乎只輸出異常的消息和StackTrace屬性。

爲了說明我的意思,下面的單元測試將輸出三個部分:

  • 錯誤消息
  • 錯誤堆棧跟蹤
  • 標準控制檯輸出(包含我希望的信息,如「 Fault Detail等於ExceptionExtell,可能由IncludeExceptionDetailInFaults = 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(); 
} 

有了這個信息將使得測試和部署少了很多痛苦的初始階段。

我知道我可以只是包裝每個單元測試在一個通用的異常處理和寫入例外控制檯,並重新拋出(如上)我所有的單元測試中,但似乎 實現這一目標的一個很囉嗦的方式(並且看起來很糟糕)。

有誰知道,如果有什麼辦法讓每當未處理異常發生時包含這些信息?有沒有我失蹤的設置?我的服務配置缺乏正確的故障處理嗎?也許我可以爲某個單元測試框架編寫某種插件/適配器?也許這是我應該使用的另一個單元測試框架!

我的實際設置是通過Gallio爲開發環境執行的xUnit單元測試,但我確實有一套單獨的「煙霧測試」套件,我希望我們的工程師可以通過xUnit GUI測試跑步者(或Gallio或其他)來簡化最終部署。

感謝。

Adam Adam

回答

1

我想我已經找到了解決辦法。 Oleg Sych已經實現了一種WCF行爲,它透明地將服務器的異常封送到客戶端,在客戶端上提升它們,就好像它們在那裏發生一樣。

這與將服務行爲屬性添加到服務合同(接口)一樣簡單。

如果決定編寫在單個進程中執行的現有代碼應該通過WCF服務進行分發,則此方法尤其有用。這意味着它可以在不需要對客戶端的異常處理進行任何更改的情況下實現(例如,您仍然可以在客戶端上處理SecurityException而不必在處理更多分佈式設計時處理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我做出了改變,這樣它看起來與一個本地名稱等於或者「詳細信息」(用於ws2007HttpBinding「或」一個細部節點細節」(爲basicHttpBinding的)。

我希望這有助於。

亞當

0

控制檯輸出在「測試結果」窗口中作爲列提供。

0

Gallio默認將控制檯輸出重定向到其診斷日誌。所以你應該直接在測試報告中看到你需要的信息。

在部分詳細信息的HTML報告中,例如展開測試樹並找到您的測試方法。

Console output in Gallio test report

+0

謝謝,但我知道,控制檯輸出爲t捕獲他測試跑步者(並隨後顯示)。我正在尋找獲取由測試運行器自動捕獲和輸出的`FaultException`的`Detail`屬性的內容,用於未處理的異常(即,我不想避免在每個單元測試中編寫一個異常處理程序只是爲了顯示這個額外但重要的信息)。 – Adam 2011-01-12 09:49:23