如何使用Moq模拟SoapException以进行unit testingerror handling

我inheritance了一个调用SOAP Web服务的小型控制台应用程序。 这是一个嵌套的try-catches的悲剧性混乱,它以各种方式记录exception,并且我想围绕抛出SoapException时它的行为进行一些测试。

问题:当我无法模拟接口并且无法使属性或方法“虚拟”时,如何使用Moq模拟像SoapException这样的类?

再解释一下:

要测试此error handling,我需要控制SoapException对象的Actor属性,以及Detail属性以validationerror handling。

我的unit testing代码的片段:

 [TestMethod] public void MyTestMethod() { Mock soapMock = new Mock(MockBehavior.Strict); soapMock.SetupGet(ex => ex.Actor).Returns("Test Actor"); 

由于我正在模拟一个具体的类,并且Actor属性未标记为“Virtual”,因此在测试运行期间执行SetupGet(...)行时Moq会抛出此exception:

System.NotSupportedException:非虚拟(在VB中可覆盖)成员上的无效设置:ex => ex.Actor

经过一些阅读,理想的答案是模拟一个界面,在这种情况下我无法做到。 由于这是.NET框架中的一个类,我也无法将Actor属性神奇地标记为虚拟。

我如何模拟SoapException,或者我可以通过不同的方式validationerror handling?

顺便说一下,我首先想要创建一个实际的SoapException,其中包含一些XML节点,但我很快就陷入了以编程方式创建XML文档树的漏洞。 我可以做到,但它需要更多的测试设置代码,如果可能的话,我想避免使用。

使用Moq无法模拟它。 一种选择是使用Microsoft Fakes Framework中的 Shim 。 您可以在尝试模拟的代码不使用接口或虚拟方法(如您的方案中)的情况下使用它。

请参阅msdn的Shim的以下说明。

填充程序在运行时修改应用程序的已编译代码,以便它不运行指定的方法,而是运行测试提供的填充程序代码。 填充程序可用于替换对无法修改的程序集的调用,例如.NET程序集。

http://msdn.microsoft.com/en-us/library/hh549175.aspx

请注意,Fakes框架仅适用于Visual Studio Ultimate或Premium。

我在同样的情况下模拟SoapException。 我使用SoapException的构造函数来传递Detail,Actor等。下面是使用Rhino Mocks。

 //Build your xmlDocument SoapException mockSoapException = MockRepository.GenerateMock("Mock SoapException", new XmlQualifiedName(), "TEST", xmlDocument);