如何使用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);