【发布时间】:2014-02-14 09:13:55
【问题描述】:
我继承了一个调用 SOAP Web 服务的小型控制台应用程序。嵌套的 try-catch 以各种方式记录异常,这是一个悲惨的混乱,我想围绕它在抛出 SoapException 时的行为进行一些测试覆盖。
问题:当我无法模拟接口并且无法将属性或方法设置为“虚拟”时,如何使用 Moq 模拟 SoapException 之类的类?
多一点解释:
为了测试这个错误处理,我需要控制 SoapException 对象的Actor 属性,以及Detail 属性以验证错误处理。
我的单元测试代码的 sn-p:
[TestMethod]
public void MyTestMethod()
{
Mock<SoapException> soapMock = new Mock<SoapException>(MockBehavior.Strict);
soapMock.SetupGet<string>(ex => ex.Actor).Returns("Test Actor");
由于我正在模拟一个具体类,并且 Actor 属性未标记为“虚拟”,因此在测试运行期间执行 SetupGet(...) 行时,Moq 会引发此异常:
System.NotSupportedException:非虚拟(在 VB 中可覆盖)成员上的设置无效:ex => ex.Actor
经过一番阅读,理想的答案是模拟一个界面,在这种情况下我无法做到这一点。由于这是一个嵌入到 .NET 框架中的类,我也不能神奇地将 Actor 属性标记为虚拟。
如何模拟 SoapException,或者是否有其他方法可以验证错误处理?
顺便说一句,我首先创建了一个实际的 SoapException,其中包含一些 XML 节点,但我很快就陷入了以编程方式创建 XML 文档树的兔子洞。我可以做到这一点,但它需要更多的测试设置代码行,如果可能的话我想避免。
【问题讨论】:
标签: c# unit-testing soap error-handling moq