2011-01-11 60 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